【Unity】汎用性のあるシングルトンパターン
Unityでシングルトンを使う手順を示します
MonoBehaviourを継承している場合(シーン上のゲームオブジェクトにアタッチするスクリプト)
- Unityプロジェクトを開き、シングルトンを実装するスクリプトを作成します。新しいC#スクリプトを作成し、名前を設定します(例: SingletonManager)。
SingletonManager
スクリプトの中身を以下のように変更します。
using UnityEngine;
public class SingletonManager : MonoBehaviour
{
private static SingletonManager instance;
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject); // シーン切り替え時にオブジェクトを維持
}
else
{
Destroy(gameObject);
}
}
// 他のコンポーネントからこのシングルトンを参照できるプロパティ
public static SingletonManager Instance
{
get { return instance; }
}
public void DoSomething()
{
Debug.Log("SingletonManagerで何かを実行します。");
}
}
このスクリプトはシングルトンマネージャを作成し、シーン間でオブジェクトを維持するためにDontDestroyOnLoadを使用します。
- Unityエディタで、ゲームオブジェクトを作成し、SingletonManager スクリプトをアタッチします。このゲームオブジェクトはシングルトンとしての役割を果たします。
- シーン内の他のオブジェクトから、シングルトンマネージャのインスタンスにアクセスできます。例えば、以下のように他のスクリプトから呼び出すことができます
SingletonManager.Instance.DoSomething();
これにより、Unityプロジェクトでシングルトンパターンを使用する準備が整います。シングルトンマネージャを使って、ゲーム内のさまざまな場所から共有のデータや機能にアクセスできます
非MonoBehaviourクラスの場合
プロジェクトビューにスクリプトファイルが存在するだけで、インスペクターでアタッチされない場合です
MonoBehaviourを継承していないクラスをシングルトンとして実装する場合、シングルトンマネージャを作成し、MonoBehaviourを継承しているゲームオブジェクトにアタッチすることはできません。代わりに、シングルトンパターンの実装が変わります。
以下に、MonoBehaviourを継承していないクラスでのシングルトン実装のサンプルコードを示します。
public class MySingleton
{
private static MySingleton instance;
private MySingleton()
{
// コンストラクタをprivateにして外部からのインスタンス化を防ぎます
}
public static MySingleton Instance
{
get
{
if (instance == null)
{
instance = new MySingleton();
}
return instance;
}
}
public void DoSomething()
{
// 何かの操作を実行します
}
}
このクラスはMonoBehaviourを継承していないため、ゲームオブジェクトにアタッチすることはできません。代わりに、このクラスの唯一のインスタンスにアクセスするためにInstance
プロパティを使用します。
このようにして、非MonoBehaviourクラスとしてのシングルトンを実装し、必要なときにアクセスできるようになります。他のクラスからは、MySingleton.Instance を使用してこのシングルトンのインスタンスにアクセスできます。
使い方
前の例で作成したMySingletonクラスを使用して、シングルトンのインスタンスを取得し、そのインスタンスにアクセスする方法を以下に示します。
MySingleton クラスのインスタンスを取得します。
MySingleton singleton = MySingleton.Instance;
このコードにより、MySingleton クラスの唯一のインスタンスが取得されます
シングルトンのインスタンスを使用して、メソッドやプロパティにアクセスします
singleton.DoSomething(); // シングルトンのメソッドを呼び出す
これにより、MySingleton クラスの唯一のインスタンスが持つメソッド DoSomething() が呼び出されます
全体コード
using UnityEngine;
public class SingletonDemo : MonoBehaviour
{
private void Start()
{
// MySingletonクラスの唯一のインスタンスを取得
MySingleton singleton = MySingleton.Instance;
// シングルトンのメソッドを呼び出す
singleton.DoSomething();
}
}
このようにして、非MonoBehaviourクラスとして実装されたシングルトンを使用できます。このシングルトンパターンを使うことで、アプリケーション内の異なる部分から唯一のインスタンスにアクセスでき、共有のデータや機能を効果的に管理できます
ディスカッション
コメント一覧
まだ、コメントがありません