📚

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