【Unity】アタッチされていないシングルトンの作成
「アタッチしない」シングルトンパターンを実装するために、以下のようなC#スクリプトを使用することができます。このパターンは、特定のクラスに対して唯一のインスタンスを確保し、全体のゲーム中で簡単にアクセス可能にするためのものです。
シングルトンで作られたスクリプト
public class GameManager
{
    private static GameManager instance;
    public static GameManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new GameManager();
            }
            return instance;
        }
    }
    // 例えば、ゲームスコアを管理するプロパティ
    public int Score { get; set; }
    // コンストラクタを private にすることで、外部からのインスタンス化を防ぐ
    private GameManager()
    {
        // 初期化コード
        Score = 0;
    }
    // その他のメソッド
    public void AddScore(int points)
    {
        Score += points;
    }
}このスクリプトでは、GameManager クラスに静的な Instance プロパティを提供しています。このプロパティは、クラスのインスタンスがまだ作成されていない場合に新しいインスタンスを作成し、すでに存在する場合はそのインスタンスを返します。この方式により、GameManager.Instance を通じてどこからでもアクセスでき、簡単にゲームの状態を管理できます。
また、コンストラクタは private に設定されているため、このクラスは外部から直接インスタンス化することができません。これにより、シングルトンパターンの要件を満たしています。シングルトンインスタンスに対する操作やデータアクセスは、すべて GameManager.Instance を通じて行います。
アタッチされているスクリプトからのアクセス
Unityでシングルトンインスタンスにアクセスし、そのメソッドを呼び出すためには、シングルトンパターンを適用したクラス(例えば上記のGameManagerクラス)を利用します。以下は、シングルトンインスタンスのGameManagerにアクセスし、スコアを更新するためのサンプルスクリプトです。
この例では、Playerクラスを作成し、プレイヤーがポイントを獲得するたびにGameManagerのスコアを更新するメソッドを呼び出します。
using UnityEngine;
public class Player : MonoBehaviour
{
    void Start()
    {
        // ゲーム開始時にスコアを0にリセット
        GameManager.Instance.Score = 0;
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) // スペースキーを押した場合
        {
            ScorePoints(10); // スコアを10点加算
        }
    }
    private void ScorePoints(int points)
    {
        // GameManagerのインスタンスを通じてスコアを加算
        GameManager.Instance.AddScore(points);
        // 現在のスコアをコンソールに表示
        Debug.Log("Current Score: " + GameManager.Instance.Score);
    }
}このスクリプトをUnityエディター内でゲームオブジェクトにアタッチして使用します。プレイヤーがスペースキーを押すたびに、ScorePointsメソッドが呼び出され、GameManagerのAddScoreメソッドを通じてスコアが加算されます。これにより、GameManagerのスコアが更新され、その変更がすべてのスクリプトからアクセス可能になります。
この方法で、シングルトンオブジェクトのメソッドを簡単に呼び出し、ゲーム全体で共有するデータを効率的に管理することができます。






ディスカッション
コメント一覧
まだ、コメントがありません