Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity 小ネタ オブジェクトの一連の動作をDOTweenで実装

今どきの若者は知らないだろうし興味もないだろうが、パチンコには羽根物というタイプというものがあり、スタートとというポケットに玉が入ると、中央にある羽根が開いて、その羽根が開いている間に玉が入り、その中のVゾーンというエリアに玉が入ると、大当りとなり、玉がたくさん出るというものだ

最近はなかなかこうしたタイプの台はごくまれになってしまったが、パチンコの面白さといえば、おもちゃ的なギミックや、それによる玉の思わせぶり、かつ不可解な動きである

学生自体は毎日遊んでいたものだ

あ~っ、羽根物ブームの復活こないかなぁ~っ

 

あっ、取り乱してすいません

まあ、パチンコ屋になかなか設置されなくなってしまったので、羽根物パチンコの携帯アプリを制作して、若者に知ってもらい、何とか復活できないかと考えているわけである

 

前置きがとても長くなった

ここまでかなりの年月がかかっているが、だいぶ形にはなってきた

下記が動作イメージである

 

今回は、下記の円盤に一部玉を受け取るような切り欠きのある物体の、左右の傾き動作についての実装の仕方について書き残しておく

 

〇用意したもの

 DOTweenアセット

 自分も詳しくないので、詳細は解説しないが、これはオブジェクト、テキスト等の動作、アニメーションを簡単なスクリプトで実装できる、ライブラリ的なもの

 自前でスクリプトで実装することもできるが(多分(~_~;))、面倒というか、効率が悪く、早く形にすることでモチベーションの低下を防ぐ効果もあると考え、このアセットを使用しての実装とした

 定番のアセットなので、プロジェクトへの導入方法等はググッてみて

 

〇動作させたい仕様

①右に45度1.5秒間で傾ける

②中央まで1.5秒間で傾ける

③左に45度1.5秒間で傾ける

②中央まで1.5秒間で傾ける

以降、上記の繰り返し

という一連の動作の繰り返しのため、DOTweenの使用方法としては初のシーケンスというもので実装してみた

 

スクリプト

using DG.Tweening;

    void Start()
    {
        var sequence = DOTween.Sequence();

        sequence.Append(transform.DOLocalRotate(new Vector3(81.62f, 0, 45), 1.5f));
        sequence.Append(transform.DOLocalRotate(new Vector3(81.62f, 0, 0), 1.5f));
        sequence.Append(transform.DOLocalRotate(new Vector3(81.62f, 0, -45), 1.5f));
        sequence.Append(transform.DOLocalRotate(new Vector3(81.62f, 0, 0), 1.5f));

        sequence.SetLoops(-1, LoopType.Restart);

        sequence.Play();

    }

 

スクリプトの解説

見たままであるが・・

シーケンスの変数を作成して、回転動作をそれぞれ4つ登録

その後にループするように設定

最後に再生開始

最初はDORotateを使用していたが、原因不明だが動作が一巡してもうまくつながらず、ループしないので、DOLocalRotateを使用してみたら何とか出来た

LoopTypeについては、加算し続ける、ヨーヨー、リスタートの三種類があり、リスタートを使用したところ、つながった動作にすることができた

 

〇雑感

さすがにトゥィーンというだけのことはあり、デフォルトの動作でも何となくイーズイン、アウトの動作が入っているのか、等速で動いている感じがないのは意外と良いかもしれない

 

今回はここまで

 

 

 

Unity 小ネタ UIを画面の一番手前に表示する方法

前々から不自由に思いつつも、位置を調整して何とかしてきたが・・・

どうしても3Dオブジェクトの前にUIを表示したくなったので、調べてみた

 

結果、大した内容ではなかったが、自分で試しながら発見するようなことは不可能と思われる内容だったため、忘れないように書き残しておく

 

上の図のように、赤いCubeの向こう側にUIのテキストを配置

 

この時のCanvasのRender Modeは、World Space

この状態だと二つ上の図の右の絵のように、Cubeに隠れてUIのテキストが見えない

 

そこで、カメラを追加し、設定を上記のようにする

Clear Flags : Depth only

Culling Mask : UI

Depth : 1 メインカメラよりも大きい値に

 

Cubeの前にUIテキストが表示された!!

 

でも何か解せない

カメラを追加しなくても、UIのRender ModeをOverlayにするだけで、常に手前に表示されるような気もする(~_~;)

 

今のところは用途が思いつかないが、追加したカメラをCanvasのRender Cameraに設定すれば、メインカメラは動かしても、UIは移動しないので、何かには使えそう

 

いや、やっぱりOverlayにすれば、特定のカメラでのレンダリングはされないようなので、いちばん手前に表示されそう(~_~;)

 

もう少しへ勉強が必要そうだが、今日はここまで



 

 

 

 

Unity 小ネタ Hinge Joint による玉戻りの防止

一般的には極めて需要はないと思うので、自分用の覚書として残しておく

 

例によって、パチンコアプリの制作中

パチンコ自体知らないとまったく意味不明だろうが・・・

いや、ピンボールゲームを作る際の、玉を発射した後に発射通路に玉が戻ってこないようにするようにはしたいのではないだろうか・・

おそらく応用は聞くのではと・・

 

ということで、完成品イメージ

完成イメージ

画質の関係で分かりづらいが、発射した玉は、戻り防止弁により、発射後は発射通路に戻ることはない(たぶん)

 

ということで、実装方法を書き残しておく

 

○用意するもの

 Unityの3Dオブジェクト

  1. Cube        玉を跳ね返すシャッター部分
  2. Cylinder シャッターの軸部分 

   その他は割愛

 

○Untiy Editor上での設定

まずはCubeのサイズを調整して板状に

Cylinderもサイズ調整して、CubeはCylinerの子オブジェクトにして、Cylinderを軸にシャッターが回転するようにする

 

次に親オブジェクトのCylinderに、RigidBodyとHinge Jointを追加

 

◆設定のポイント 

●RigidBody

・Mass、Drag、AnglarDrag

 大き目の設定にしているが、正直正解はわからない

 一つだけ言えるのは、Massを小さくすると、シャッター(Cube)に玉に接触した場合の

玉からの力の影響が大きく、軸を関係なく押されて回転ではなく、位置ごとずれるようになる

 Use Gravityのチェックをオフにしているのに、影響あるのか疑問はわくが、おそらくMassが大きければ元の場にとどまる力が強くなるのだと思われる

 

・Constraints

 Freeze Position、Freeze Rotationともにチェックを入れている

 動いてほしくないからなのだが・・・

 納得いかないのは、シャッター(Cube)に玉が当たると位置がずれてしまうんだよ、これが( 一一)

 これはここ数か月いろいろ設定を試したが、何かに接触しなくても位置がずれていってしまうようなこともあり、Editor上の設定での解決方法はわからづじまい 

 

●Hinge Joint

・ConnectedBody

   シャッター(Cube)を設定

・Axis

   Y軸中心に回転させたいので、Yのみに1を設定

・Spring

   玉が当たった後に自動で元の角度に戻るようにバネを設定

・Limits

   回転角度の制限を設定

 

Cubeの方には、Box ColliderとRigidBodyを追加

〇設定のポイント

 とくにはない

 軸はCylinderのHingeJointに連結しているためか、Constraintsをすべてフリーにしていても、Cylinderの軸を中止に回転だけするようなかたちとなる

  

 修正忘れ

  Massは0.005にしないと、玉の力の影響が強めに出て見た目が悪い

 

◎問題点

 下記を見てほしい

位置がずれていく

 画質が悪くわかりづらいが、玉が当たっているうちに軸の位置がズレてしまっている

 ConstraintsでFreeze Positionにチェックを入れているにもかかわらず・・

 

 う~ん

 謎仕様

 力がかかった時の影響は別扱いなのだろうか??

 

 悩んだ挙句の末

 

 スクリプトで対応

 最初の位置を記憶しておき、玉が発射されるたびにズレをもとの位置に戻すようにした

 最初はUpdate()で毎フレーム修正にしてみて、これが見た目ずれがないように見えるが、毎フレームというのが精神衛生的によくないので(負荷がとられる気がする)このようにしてみた

 

以上、今日はここまで

 

 

 

 

Unity 超小ネタ UnityHubにプロジェクトが追加できない原因

UnityHubにプロジェクトが追加できない原因がわかったので、メモ程度に残しておく

 

Unity Hub Ver.3.6.1 ⇒その前のバージョンでも同様だった

 

◆現象

 ・Unity HubのAddボタンの横の▼を押して、Add Project from Diskを押す

 

 ・フォルダから「93%Rush」というフォルダを選択すると、下記のような表示がでて、Unity Hubに追加できない


◆解決策

 まあ、お分かりだろうと思うが、「%」の文字をフォルダ名から削除することにより追加ができた

 申し訳ないが、他にどのような文字が使えないのかは不明

今回は以上

 

Unity 小ネタ Physics オブジェクトがぶつかり合ってもバウンドしない場合の対応

例のごとく?! パチンコのアプリを開発している(多分(~_~;))

 

この手のアプリは、物理演算任せなので、大してコードを書かないのが楽で、いつか量産したいと考えている

が、いまだベースの機能の仕様すらまともに確定できていないのである

(~_~;)

原因というか、問題点は、Unityの物理演算の仕様が、所詮はゲームに使用する想定なので、大してリアルな表現ができるわけではない点である(Unityのせいではなく、採用しているシステムの問題?!)

 

 

ということで・・

今回は、全体的に実寸サイズを基準に作成してみている

玉・・10.5mm、5.5g

これをベースとして、他のオブジェクトを構成

 

そのおかげか、Gravityはデフォルトの-9.81で、玉の動きの見た目は違和感なさそうな感じなのだが、ふと気が付く

 

玉が釘にあたっても、バウンドしない・・・

 

 

Physic Materialは下記の通りBouncinessはMAXの1にしており、釘のほうも同じ設定にしている

 

Gravityの数値を強くすると、バスんどするようにはなるのだが、それでは今回の実験の実物サイズで制作している意味がない

 

ちなみに、今までは実物の10倍ぐらいの大きさで作成していたので、Gravityも合わせて10倍ぐらいにしていた

そうでないと、とても鉄の玉の落下には見えないので・・

 

 

いろいろネットで調査すること数時間・・・

 

Bounce Threshold 

Unity マニュアルより

速度の値を設定します。 2つの衝突するオブジェクトの相対速度がこの値より小さい場合、オブジェクトは互いに跳ね返りません。この値はジッタも減少させるため、非常に低い値に設定することは推奨されません。

 

 

今回は、オブジェクトのサイズが小さいので、動作エネルギーも小さいのか?!、この閾値以下となってしまうのではと気づいた

 

Edit-Project Setting-左のタブのPhysicsをクリック

 

Bounce Thresholdの値はデフォルトが2

この値を下げてみると・・・・ 

 

 

バウンドするようになった!!

 

なお、Unityマニュアルの説明だと、非常に小さい値は推奨していないとのことなので、これまたどこを落としどころにするかは、いろいろ進めてみながらとなりそう(~_~;)

 

今回はこれにて終了

 

 

 

Unity 小ネタ Game Viewだけ3Dオブジェクトが表示されなくなるのを解消

だいぶ前からある問題点が解消されず、このせいで(いやそれだけではないが( 一一))ゲーム制作のモチベーションダダ下がりであった

 

ネットで検索しても、同様の事例は見つからず(大して探していないが・・( ;∀;))

 

そろそろあきらめて、Twitterに投稿しようか、だれか詳しそうな人に質問してみようか迷っていたところ・・・

 

気合で偶然解決策を見つけた (^_-)-☆

 

と、前置きが長くなったが、詳細を下記に載せておく

 

〇不具合

  • プロジェクトはUniversal Rander Pipelineで描画
  • BlenderからFBX形式で3DモデルをUnity Editorにインポート
  • モデルにURP Litシェーダーマテリアルを設定
  • マテリアル設定にて、半透明となるようにSurface OptionのSurface typeをTransparentに設定

 ◆Inspector上のマテリアル設定


◆Scene View

 上記の設定により、オブジェクトが半透明で表示される

 

ところが・・・・

Game Viewでは・・・

あるはずのところにオブジェクトが表示されていない!!!!!

 

ということで、カメラの設定やら、マテリアルの設定やら、マテリアルを変えてみたりの試行錯誤の日々

 

下記のように、Surface TypeをOpaqueの透過をなくしたタイプにすると

 

表示される( 一一)

 

マテリアル自体は、消えてしまうオブジェクトの上にあるオブジェクトと共用なので、上のほうだけ表示されるのも意味不明!?

 

ふと、マテリアルのSorting Priorityなるもののスライダーをスライドしてみたら・・・

 

表示されたっ!!

 

Sorting Priorityを1にするだけで表示はされた

 

なんじゃこりゃーーーっ

 

〇考察

Unity  Universal RP 14.0.2マニュアルより

  • この設定はパフォーマンスの最適化の設定らしい
  • 半透明でないオブジェクトの表示部は、その背面にあるものは描画する必要がないが、半透明のものは重ねて描画する必要があるので、この設定が効いてくる
  • 同じマテリアルを使用していても、位置によってその前面または周辺の表示物が違えば、表示の優先順も変わるため、Priorityが0でも上部のものは表示され、下部のものは表示されないということが起きるみたい

 

こんな設定、エロい人はすぐわかるのかなぁ?! (~_~;)

 

ところで、ユニバーサルレンダーパイプラインだけのマニュアルがあるとはしらなんだ

docs.unity3d.com

 

今回は以上

Unityをこれから始める方へ 私の経験からの「こうしておけばよかった」 その3

今回は、参考書ではなく、インターネットで参考にしたサイトのお話

先駆者のノウハウを習得するのが中上級者への近道であることは間違えないので、参考にしてはと・・

 

you tubeチャンネル Unityゲームスタジオしまづ

www.youtube.com

 

こちらはyou tubeの大変参考にさせてもらっているチャンネル

UnityのちょっとしたTipsから、タイプ別のゲームについて、完成までの過程を10分程度の動画に分けてゆっくりと解説してくれている

動画の通りに作ってみるもよし、自分なりのアレンジをしてみるもよし

自分でアプリを作っていて、こういう場合にどう実装したらいい、というのは結構迷って時間がかかるものなので、そうした場合には見てみることをおススメする

 

 

〇Udemy オンライン動画コース

www.udemy.com

 

こちらはUnityのみではないが、Unityで検索すると様々なゲーム開発事例を交えた動画コースが掲載されている

なお、受講する場合はセール中に申し込むことをおススメする(金額が全然違うため)

通常は25000円とか高額だが、セール中は1500~2000円程度で、何度でも見ることができ、自分のペースで進められるので、セール中ならコストパフォーマンスはかなり高いと感じる

頻繁にセールをするので、受講したくても少し待ったほうが良い(もはやどちらが正規の受講料なのか・・・)

 

先ほどyou tubeチャンネルで紹介したしまづさんも講師として参加されている

こちらではyou tubeとは違いソースコードやサンプル素材がダウンロードできたりするので、勉強がはかどりやすい

 

今回は以上