テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

GameControllerタグをどう扱うべきか…

スクリーンショット 2014-04-29 0.26.47 Unityは幾つか標準でタグを保持している。タグとはGameObjectに一つだけ適応出来る文字列で、別にリストを持っているらしく、FindWithTagはFind系の中で最速の呼出速度を誇る…らしい。

さて、タグには特殊な物が2つある。一つはMainCamera、これはCamera.mainを行った際に取得するカメラを設定する非常に特殊なタグ。

もう一つがEditorOnly、このタグを持つGameObject以下のGameObjectはゲームに含まれない。例えばエディタでしか使用しないデバッグウィンドウや、シーン情報を保持しておくクラスをアタッチしたオブジェクト等はこのタグを設定しておくとビルド時に自動的に排除されるような形となる。

tsubakit1.hateblo.jp


他にもタグFinish(ゴールに設定)、Player(自機に設定)、Respawn(復活地点)タグがあるが、これは割とアクションゲームを前提としたタグのようだ。


さて、今回話題にするのが「GameController」タグだ。これは何かの機能があると見せかけて、特に無い只のタグのようだ。その為、何に付与するのかは開発者に委ねられている。

ひとまずUnityのチュートリアルSTG, ステルスアクション)を眺める限り、GameControllerタグはゲームマネージャーのような形でシーンのゲーム進行を管理するオブジェクト(スコア管理やメッセージのハンドリング)として使われる物らしい。ゲームの進行や各UIの展開状況、残機や時間・シーン遷移タイミング等をこのGameObjectに付与しておき、必要になったら呼び出す寸法だ。

この場合、タグで取得したオブジェクトからgetComponentで目的のコントローラーやハンドルマネージャを引っ張りだす必要がある。正直Singletonでも十分目的が達せられると思うが、シーン構造から挙動が推測しやすくなるので、Singletonを使用したホニャララManagerを使用する場合も、Game Controllerに配置する事をお勧めしたい。


ここで問題となるのが、DontDestroyの有無だ。破棄されると次のシーンから値を参照出来なくなるため、オブジェクトを破棄せずに保持しっぱなしにするゲームも割とあるらしい。彼らの場合、シーン情報の管理やリソースの管理もGameControllerで行っていることが多いとの事。

しかしDontDestroyOnLoadを付与したオブジェクトは、リセットも手動で行う必要性が出てくる。破棄するオブジェクトと破棄しないオブジェクトを混合すると、オブジェクト間の参照がややこしくなる事もある。自分のSingletonはDontDestroyonLoadを入れていないのはそれが理由だ。

この場合、ScoreControllerタグのような物を用意しDontDestroyOnLoadを付与することが考えられるが、次に「何時破棄するか」といった問題も浮上してくる。そしてDestroyOrder(シーン遷移時に登録されているオブジェクトを破棄する)のようなクラスが出来上がっていくという・・・

どう実装するか、何時も悩ましい。