0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UnityでのC#文法 〜シングルトン編

Posted at

はじめに

Unityでゲームを作っていると、GameManagerやAudioManagerのように、
「どこからでもアクセスしたいけど、インスタンスは1つだけにしたい」
というクラスがよく登場します。

そのときによく使われるのがシングルトンです。

シングルトンとは?

Singletonとは、

「クラスのインスタンスが常に1つだけ存在し、
どこからでも同じインスタンスにアクセスできる」

という設計パターンです。

Unityではよく、次のような形で参照されます。

GameManager.Instance

このInstanceを通して、どのスクリプトからでも同じGameManagerにアクセスすることができます。

なんで必要?

例えば、次のような処理を考えてみます。
・スコア管理
・ゲームの進行状態管理
・BGM・SEの再生管理

これらは、
・プレイヤー、敵、UIを複数管理する
・シーンが変わってもやりたいことは共通
といった特徴があります。

毎回FindObjectOfTypeを使ったり、すべてのスクリプトに参照を渡したりするのは大変です。

どこからでも、同じものにアクセスしたい。
このような場合、シングルトンが必要とされます。

基本的な実装

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }

    void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
            return;
        }

        Instance = this;
    }
}

通常、上のような書き方がよくなされます。

最初の部分に注目です。

public static GameManager Instance;

staticとは、クラスに紐づく変数のことをいいます。

つまり、「今存在している唯一のGameManager」 を指しています。

DontDestroyOnLoad

シーンをまたいでもシングルトンを保持したい場合、次の1行を追加することが多いです。

DontDestroyOnLoad(gameObject);

これで、シーン遷移しても破棄されず、常に同じGameManagerを使えるようになります。

おわり

シングルトンは、Unityでゲームを作るうえで非常に大切な要素です。
これをマスターすることは、しっかりとしたゲームへと繋がります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?