前提・実現したいこと
先輩からシングルトンのスクリプトを教えてもらい、早速使ってみようと思いましたが、ネットの記事とかで紹介されてるような動きをしないです。 継承を使ったことがないので使い方があってるかどうかも教えて欲しいです。
教えてもらった先輩にはしばらく会えないため質問しました。
発生している問題・エラーメッセージ
シーンを移動してから同じシーンに戻るとオブジェクトが増えている。
シングルトンの役割を果たしていない
該当のソースコード
c#
1public class SceneController : SingletonMonoBehaviour<SceneController> 2{ 3 private void Awake() 4 { 5 DontDestroyOnLoad(this.gameObject); 6 } 7 public void GoTitle(){ 8 SceneManager.LoadScene("TitleScene"); 9 } 10 11 public void GoStageSelect(){ 12 SceneManager.LoadScene("StageSelectScene"); 13 } 14 15 public void StageLoad(string scenename){ 16 SceneManager.LoadScene(scenename); 17 } 18}
貰ったシングルトンのコード
c#
1public class SingletonMonoBehaviour<T> :MonoBehaviour where T: MonoBehaviour { 2 private static T _instance; 3 4 public static T Instance 5 { 6 get 7 { 8 if(_instance == null) 9 { 10 //シーン上から取得する 11 _instance = FindObjectOfType<T>(); 12 13 } 14 15 //FindObjectOfType<T>();が失敗していないか 16 if (_instance == null) 17 { 18 Debug.LogError(typeof(T) + "is nothing"); 19 } 20 return _instance; 21 } 22 } 23 24 protected virtual void Awake() 25 { 26 CheckInstance(); 27 } 28 29 bool CheckInstance(){ 30 31 //this → SingletonMonoBehaviour.cs自身 32 //→ Singletonから呼び出されている。 33 //→最初に作られたSingleton == 取得してきたSingleton 34 if(this == Instance){ return true; } 35 36 //今作られたものと最初に作られたのもが違った場合 37 //今作られた物を削除する。 38 Destroy(gameObject);//←thisにするとスクリプトだけ消える 39 return false; 40 } 41 42 43}
補足情報(FW/ツールのバージョンなど)
Unity 2019.2.4f1
・>ネットの記事とかで紹介されてるような動き とはなにか
・質問者さん自身は、このスクリプトをどう使っているのか
があると回答が来やすくなるかと思います。
今のままでは、使い方だけ聞いている丸投げの質問とみなされる可能性があります。
ご指摘ありがとうございます。
○○マネージャーとしてシーン間をまたいでシングルトンのスクリプトがついたゲームオブジェクトを残しているのを見て真似してみました。
上記のコードを空のオブジェクトに付けて使っていますが上記の問題通りです。
シングルトンを継承してDontDestroyしている記事が無かったので自分なりにやってみたのですが、そもそも自分の使い方で合っているのかが聞きたかったです。
少し気になる所があります…
>シーンを移動してから同じシーンに戻るとオブジェクトが増えている。
>シングルトンの役割を果たしていない
この「オブジェクト」ですが、この「シングルトン」が生成したものでしょうか…?
それが事実であれば、シングルトン側で生成したオブジェクトは
「シングルトン」に結びつきます…。
いくらゲームシーンが変化しようと、「シングルトン」に結びついてオブジェクトが生成されてるため、消失致しません…。
シングルトンは基本的に「ゲームが生きている」限り、ずっと存在し続けます…。
シングルトン側で生成したオブジェクトは「シングルトン」が処理する必要があります…。
たとえば、Scene終了時に自動的にゲーム中にシングルトンを使って発行したオブジェクトがあるなら
Scene終了時に走らせる(ゲーム中に生成したオブジェクトの明示的破棄)処理を、Stage終了処理時に自動的に走るイベントに噛ませる必要があると思う次第です…。
(忘れてください)
>シーンを移動してから同じシーンに戻るとオブジェクトが増えている。
>シングルトンの役割を果たしていない
ただ、これに関する回答とすると、Singletonでオブジェクトと作ってる故・・・・。
Singletonは全シーン共通のオブジェクト故、シーンが変わってもその情報を保持致します…。
簡単なソリューションとしては、Singleton側に紐づいた生成物を
Scene変更時に走る処理があると存じますので…その時にSingletonの適切な初期化処理を走らせるのはどうでしょうか…
回答1件
あなたの回答
tips
プレビュー