UnityのGameManagerってどこにあるの?探しても出てこなかった話
最初にUnityを触っていて「GameManagerどこ?」ってなったことありませんか。
わたしは普通にメニューやクラスを探して、APIリファレンスも漁って、それでも見つからず…。
結果的に「あ、存在しないんだ」と気づいたので、そのときのメモを残しておきます。
標準ではGameManagerは存在しない
Unityには「GameManager」という組み込みクラスはありません。
UnityEngineの中を探しても定義は出てきません。
だから「どこ?」と探しても永遠に見つからない。
結局は自分で作るクラスという話でした。
歯車アイコンの正体
GameManager.cs というファイルを作ると、Projectビューで歯車アイコンに変わります。
わたしも「え、特別扱いされてる?」と思いましたが、中身は普通のMonoBehaviourです。
演出っぽい挙動で、特別なAPIは隠れていません。
小さなサンプルを書いてみた
とりあえず最小コードを置いておきます。
シングルトンの基本形。
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public int score;
void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
GameManager.Instance.score みたいに呼べるので、小規模ゲームならこれで十分。
ただ、プロジェクトが大きくなると依存が増えて破綻しやすいので、分割やSOを使う方が安心かも。
「アタッチできない」問題でつまずいた
自作GameManagerをオブジェクトにドラッグできないときがあって、調べたら原因はだいたい以下のどれかでした。
- ファイル名とクラス名が一致していない(GameManager.cs ⇔ public class GameManager)
- publicじゃない / abstractだった
- 別のスクリプトにコンパイルエラーが残っている
- 同名クラスが他のアセンブリにあって衝突していた
神クラス化しないために気をつけたこと
「とりあえず全部GameManagerへ」というのはやらかしポイントでした。
実際に困ったのは…
- Updateで状態を全部管理し始めてスパゲティ化
- static変数を増やして起動順に依存してNull参照頻発
- DontDestroyOnLoadを多用して寿命管理がカオス
最近は「ScoreManager」「AudioManager」みたいに責務ごとに分ける、依存はInitで渡す、状態はScriptableObjectに寄せる、という風にしたらだいぶ楽でした。
まとめ:探すより作る
UnityにGameManagerは最初から存在しません。
歯車アイコンもただの演出。
だから「どこ?」と探すより、自分で必要な役割を考えて作るのが正解でした。
小さいプロジェクトならシングルトンでも十分、でも大きくなってきたら役割分割やSOに逃がすのがよさそう。
わたしは「存在しないものを探し続けて時間を溶かした」経験があるので、これから始める人は早めに知っておくと安心かなと思います。
もし体系的にUnityを学びたいなら、講座でまとめて学ぶのも一つの手です → Unity入門の森ショップ
Discussion