前提・実現したいこと
unityのC#で、「シーンAでスコアなどを表示、シーンBでスコアを10加算、シーンAにもどると加算された後の値に変わっている」など変数の値をシーン間で相互にやりとりできるようになりたく、シングルトンについて勉強しはじめました。
検索してみるとシングルトンではDontDestroyOnLoadを使う場合とget○○、set○○を使う場合がある印象を受けました。DontDestroyOnLoadを使う場合についてはあるサイトのスクリプトをコピーして実行するとうまくシーン間で値のやりとりができたのですが、get○○、set○○を使う場合について、 https://qiita.com/mczkzk/items/e20a8ee8a722a51ca1f8
のサイトを参考にさせていただいたのですが、思うようにできず、どうすれば良いか分かりません。どのようにすればうまくいくか教えていただきたく質問いたします。
(具体的には、シーンAとシーンBを用意し、それぞれに以下のスクリプトをつけています。また、各シーンでボタンを押すともう一方のシーンに遷移するようにしています。最初にシーンAからBへ移り、StartSinking関数をつけたボタンを押すとスコアが0から10に変わりsetされ、その後シーンAにもどるとDebug.Logの結果が0から10に変わっており、再びシーンBに移りStartSinking関数をつけたボタンを押せば前の結果がのこっていて10にさらに10足していくようになると思ったのですが、
実際にはシーンB内でボタンを複数回押せば10,20,,,と増えていきますが、その後シーンAに移った際のシーンAのDebug.Logや、再びシーンBに移ったさいにボタンを押した結果はまた0からになっており、値がうまく保持されていません。)
発生している問題・エラーメッセージ
なし
エラーメッセージ
該当のソースコード
C#
1<シングルトンクラス> 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class EventManager : MonoBehaviour { 7 8 private static EventManager mInstance; 9 private int num = 0; 10 11 public static EventManager Instance { 12 get { 13 if (mInstance == null) { 14 GameObject obj = new GameObject ("EventManager"); 15 mInstance = obj.AddComponent<EventManager> (); 16 } 17 return mInstance; 18 } 19 set { 20 21 } 22 } 23 24 25 26 27 public void setScore( int n ) { 28 this.num = n; 29 } 30 public int getScore() { 31 return this.num; 32 } 33 34}
C#
1<シーンAのオブジェクトにつけているもの> 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class ScoreManager : MonoBehaviour { 7 //シーンA 8 EventManager eventManager; 9 10 void Awake () 11 { 12 eventManager = EventManager.Instance; 13 } 14 15 void Update() 16 { 17 var score = eventManager.getScore(); 18 Debug.Log (score); 19 } 20} 21
C#
1<シーンBのオブジェクトにつけているもの> 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class EnemyHealth : MonoBehaviour { 7 //シーンB 8 EventManager eventManager; 9 10 void Awake () 11 { 12 eventManager = EventManager.Instance; 13 } 14 15 public void StartSinking () //ボタンにとりつけ 16 { 17 18 var currentScore = eventManager.getScore(); 19 Debug.Log (currentScore); 20 currentScore += 10; 21 eventManager.setScore(currentScore); 22 } 23} 24
C#
1<シーン遷移用> 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.SceneManagement; 6 7public class button : MonoBehaviour { 8 9 // Use this for initialization 10 void Start () { 11 12 } 13 14 // Update is called once per frame 15 void Update () { 16 17 } 18 19 public void ToB(){//ボタンにつける 20 SceneManager.LoadScene ("B"); 21 } 22 23 public void ToA(){//ボタンにつける 24 SceneManager.LoadScene ("A"); 25 } 26 27} 28
試したこと
ネット上で検索しましたが、DontDestroyOnLoadを使わない場合についてはあまり情報が得られず、シングルトンとは別でgetter/setterについても検索してみましたが知識不足で解決方法が分かりませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/11 07:21
2020/06/11 08:07
2020/06/11 09:20