Unityアクションゲーム制作記 その10 ダンジョンを走る!
終わらない敵ロジックの実装&バグ取りをしつつ、遠隔系の攻撃を実装し、なんとか、ダンジョン内を走り回れるまでになりました! あちこちバグだらけですが、同じことばかりやっていて気が滅入っていたので、敵ロジックはある程度見切りをつけて放置。やりたいことを優先して詰め込むように作業を進めました。
アセットストアにあったド派手なエフェクトを使い(↓コレとか)、
>Magical - Pro Edition
https://www.assetstore.unity3d.com/jp/#!/content/55713
扇状にオブジェクトを発射するものと、噴射タイプの二種類を実装。オブジェクトを発射するタイプは、生成したオブジェクト任せで自律行動できるように組み込むようにしました。今回このアセットを使って学んだのが、
「機能ごとに特化したコンポーネント(スクリプト)をうまく組み合わせて使う」
ということでした。「Magical」では、移動するのみ、出現時にランダムの回転・位置を与えるといった単純なものから、何かに当たったら別のオブジェクトを生成するといった感じのスクリプトなどが用意され、それを必要に応じてスクリプトをアタッチしているという構成。必要な機能を組み合わせて、最小限の大きさでいろいろなものを作っていく、Unityのゲーム制作の基本というか 当たり前のことをいまさらながら体感しました。なにぶん古い時代のマイコン世代でのプログラミング経験しかないので、汎用的に使えるものを作ろうとしたときに、なんでもかんでも1つのスクリプトに詰め込んでいた始末。この辺をうまく機能を切り分けるのも、今どきの出来るプログラマーなんだろーなーと一人で納得してました。
とりあえず使えるものは使いつつ、似たような感じで作り直していきましたが、特に問題となったのが、接触判定。アセットのままでは単純な接触判定しか行っておらず、魔法のオブジェクト同士が干渉してしまったりするので、うまくレイヤーの設定やら詳細なチェックが必要だったりするなど、自分の作っているゲームに合わせての調整は必要でした。
ダンジョンでのゲームを進行は、
・部屋に入る
・扉が閉まる
・出てきた敵を全滅させたら扉が開く
という具合にして、敵とのバトルを中心にダンジョン内を探索する楽しみも提供できたらなーと。ダンジョン自体は、もりもりとオブジェクトを置いていき、1シーン=1階層という形にしてみました。次の階層へ移動したときは、該当シーンを読み込んでいけばOKって感じです。
ここでハマったのが、扉の初期状態を作るところ。鍵のかかっている扉は閉じたままにしておき、それ以外は開けておくというふうにしていたのですが、エディタ上ではちゃんと動いているのに、スマホの実機上では開いているはずの扉が閉まったまま…。どうにも初期化処理がうまくいっていない。
扉の管理は、扉オブジェクトの一つ上に置いておいた管理用のオブジェクトでまとめて管理していました。実機で動かないものをチェックしていくのは面倒だなぁと思いながら丁寧に追いかけていくと、どうやら管理している扉のオブジェクトの生成が初期化処理のタイミングで間に合っていない模様。管理用のオブジェクトが扉の初期化処理を行おうとしたタイミングで、初期化したい扉のオブジェクト自体がないわけですから、初期化されるわけがない。
要は、シーンデータが読み込まれて実際にオブジェクトが生成される順番は決まっていないという大前提を、すっかり忘れていた(というより考えもしなかった)というものでした。結局、扉自身に初期化を行わせるように変更してなんとか解決しましたが、ごくごく基本的な考えなのに、いまだ慣れないなぁ……ちゃんと順番を考えた安全な作りを心がけないといけないのね……と反省。
なんとかダンジョン内を探索っぽい動きもできるようになったところで、セーブデータはどうするんだ? とか、ギミックも多少入れないプレイヤーは飽きるぞ? とか、報酬アイテムはどうするの? などといった根本的な問題が大噴出……この辺は、階層移動の仕組みを組み込んだあとにちゃんと考えよう、きっと考えるだろう。うん。