Unityで0からアドベンチャーゲームを作ってます。
「会話」ギミックは後回しで、「2.5D横スクロール」構築を試作しました。
3Dモデルで全配置
今回は、ライティングや影の影響を考えて、すべて3Dモデルでの配置を試みました。
2D画像をテクスチャとして3Dの板に張り付けて疑似的に2D画像のようにしています。
平面モデルは「Plane」よりも「Quad」の方が軽い。
そこで問題になったのが、3Dモデル同士での「重なり順」でした。
3Dには「Sorting Layer」と「Order in Layer」などのレイヤーがないため、優先度はどのように決めればよいのだろうか?と。
描画優先速度?「Render Queue」を見つける。
「Render Queue」の数値で前後関係を調整できるようでした。
これはテクスチャの描画速度の優先順位みたいなものでしょうか?
レイヤーの概念とは違いますが、見た目としては優先順位のような感覚で扱えました。
追加コンポーネントにて「Sorting Group」を見つける。
「レイヤーがなければ、レイヤーを作っちゃえばいい」ということで、「Add Component」にて「Sorting Group」を追加してみます。
見たことのあるレイヤー概念を追加することができました。
重なり設定がいろいろあったり、配置場所によって同じテクスチャを使っているオブジェクト同士の重なり具合だとか、ちゃんと整理していかないと混乱の元になりそうでした。
プレイヤーキャラへのアニメーション付与
3Dモデルで全配置したため、プレイヤーキャラクターももちろん3D板に投影しています。
移動の際に歩行アニメに切り替えたいので、3Dへのテクスチャをアニメに切り替える方法をいろいろと模索しました。
が、今回は断念。
おとなしく2Dスプライトでのキャラ配置でアニメを切り替えることにしました。
そして、このことが後の「影付け」と「衝突判定」の混乱を招き入れます…
アニメーション切り替えは「Animator」ウィンドウでの「アニメーションクリップ(アニメデータ)」と「トラジション(矢印での関連付け)」と「パラメータ(~したら、などの条件付け)」で設定します。
「キー操作」「左向きアニメ」「右向きアニメ」「どちらを向いて止まっているか」などで、トラジションの付け方やパラメータでの条件付与などがうまくいかずに四苦八苦しました。
単純な動きの実装でも戸惑うので、今後も覚悟が必要です。
影を付ける
今回の実装で一番こだわった部分です。
上記画像のように、2D画像で、手前のオブジェクトの影の影響を奥のオブジェクトがちゃんと受ける、という設定にできました。
3Dだけならば、特に何をすることもなく影をつけられます…
まず画像やテクスチャの透明部分に違和感(透明部分がうっすら残ってる)があり原因を追究。
これは透明度を適用するために設定したテクスチャの「Rendering Mode」の「Transparent」を「Cutout」に変更することにより直りました。
2Dスプライト配置の際は関係ないので、3Dモデルへのテクスチャ貼りの時の注意になります。
影付けに関しては迷走。
もともとは影を付けやすくするために3Dモデルを全配置したのだが、プレイヤーキャラへのアニメーションが適用できなかったために、結局のところ「2Dスプライトへの影付け」をしなくてはならなくなったということ。
「Shader」や「Debug」を駆使して、なんとか2D画像への影付けはできたものの、3Dオブジェクトの影の影響とは違う感じになってしまうところで時間をとられました。
通常は隠れている設定「Debug」画面。
インスペクターを変更させて表示させる裏技まで使うことに。
最終的には解説動画のおかげで、なんとか納得の影設定ができました。
影が付くと一気に2.5D感が増して大満足しています。
3Dと2Dの衝突判定の混在
プレイヤーキャラとカメラ追尾にともない、移動範囲を制御します。
もっともシンプルでやりやすい力業は、画面両端に透明な3Dオブジェクトを配置して、衝突によりそれ以上は進めなくする方法です。
結果は見事にすり抜け。
「Collider」と「Rigidbody」の設定をいくら見直してもうまくいかず。
途方に暮れたときに、ふとChatGPTに聞いてみました。
「3Dコライダーと2Dコライダーは衝突しませんか?」
「Unityにおいて、3Dコライダーと2Dコライダーは互いに衝突しません。」
まさに知識の無さで初心者あるある。
だとすると透明オブジェクトを2Dで作ればよいだけである。
結果的にうまくいったけれども、これはこれで混乱しました。
基本は3D空間なので、見た目も透明2Dを置いて壁のように向きを変えても、コライダーだけは向きが変わってくれません。
3D空間だと、うまくコライダー同士がぶつかってくれないのです。
しかし、これはよく考えると当たり前で、2D(ぴったし真横から見る視点)での想定なので、画像がいくら回転反転しようがコライダーはそのまま横視点を変更することがないわけです。
つまり、透明壁とプレイヤーキャラの奥行き(Z軸)を同じ数値にしてあげれば、ぴったりぶつかるようになる、ということになります。
しかし今後、3Dモデルと2D画像を衝突判定させたい場合は、3Dモデルとは別に2D用コライダーを用意して、3Dモデルとペアにする、みたいにしていく方法があるなと思いました。
もしくは、プレイヤーの2Dコライダーを消して、透明3Dモデルとペアにして3Dコライダーの方を活かす、とかでしょうか。
いろいろとやり方がありそうです。
Blenderモデルのインポート失敗
おまけ作業として、「黒板」を「Blender」でモデリングしてみました。
うまく立体感を出せたので意気揚々とUnityへインポートです。
これまた解説動画にて学び、2D画像立体化計画を実行。
すごくいい感じに。
しかしUnityにインポートした時点で、薄っぺらに戻ってしまい、うまくいきませんでした。
おまけ程度に考えていたので、そこまで詳しく調べませんでしたが、出力の仕方などを学ぶ必要があります。
けっきょくUnity内で立体化させたが、動作テスト内では特に立体の意味はなかったという…
テストプレイ
3D空間を利用した「オブジェクト順」と「影の影響」がすごく効いていて、良い感じの舞台ができたと思います。
憧れの空間が出来上がっていくのがとても楽しかったです。
今後の作業としては「ぼかし」や「光」などのエフェクト追加があります。
これもワクワクする工程の一つなのです。
コメント