質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

4602閲覧

Unity Scene遷移後も値を保持する方法

Hutax

総合スコア32

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2016/09/13 11:49

###前提・実現したいこと
現在、Unityで画面遷移について勉強しています。
2つのSceneを作成し、片方のSceneで値を保存した変数をもう片方のSceneでも用い、表示したいと考えています。

作成したソースコードはTest.csとReadData.csで、それぞれScene1、Scene2にAddComponentしています。
Test.csは、DBから値をJSONで取得し、動的に作成したボタンに取得した値をTextとして表示しています。
(ボタンには、1月1日 1月2日… と表示されています)
これにより月日が表示されたボタンをクリックすることで、Scene2に遷移します。
Scene2は、Scene1でクリックしたボタンに表示されていた月日を、改めてTextとして表示するSceneです。

###発生している問題・エラーメッセージ
ここで発生している問題は、値は保存されているのですが、クリックしたボタンに表示されている月日の値が、Scene2では別の月日で表示されてしまいます。

###該当のソースコード
Test.cs

using UnityEngine; using System.Collections; using MiniJSON; using UnityEngine.UI; using UnityEngine.SceneManagement; public class Test : MonoBehaviour { [SerializeField] RectTransform prefab = null; public static Test Instance = new Test(); public string PostMonth = string.Empty; public string PostDay = string.Empty; void Start() { StartCoroutine("GetJSON"); } IEnumerator GetJSON() { WWW www = new WWW("http://localhost/~~~.php"); yield return www; if (!string.IsNullOrEmpty(www.error)) { Debug.LogError(string.Format("Fail Whale!\n{0}", www.error)); yield break; } string json = www.text; IList List = (IList)Json.Deserialize(json); foreach (IDictionary year in List) { string Month = (string)year["month"]; string Day = (string)year["day"]; var item = GameObject.Instantiate(prefab) as RectTransform; item.SetParent(transform, false); var text = item.GetComponentInChildren<Text>(); text.text = Month.ToString() + "月" + Day.ToString() + "日"; string month1 = Month.ToString(); string day1 = Day.ToString(); Button button = item.GetComponent<Button>(); if (month1 == "1" && day1 == "1") { Test.Instance.PostMonth = month1; Test.Instance.PostDay = day1; button.onClick.AddListener(() => { SceneManager.LoadScene("NextScene"); }); } if(month1 == "1" && day1 == "2") { Test.Instance.PostMonth = month1; Test.Instance.PostDay = day1; button.onClick.AddListener(() => { SceneManager.LoadScene("NextScene"); }); } } } }

ReadData.cs

using UnityEngine; using UnityEngine.UI; public class ReadData : MonoBehaviour { public Text text; void Start() { text.text = Test.Instance.PostMonth + "月" + Test.Instance.PostDay + "日です。"; } }

###試したこと
【Unity】シーン間でスコアを共有 まとめ
このサイトを参考にstatic変数を用いてデータを保存しましたが、1月1日のボタンを押し、Scene2での表示を確かめると、1月2日です と表示されてしまいます。
1月2日のボタンを押し、Scene2での表示を確かめると、1月2日です と正しく表示されています。
なぜこのような表示となってしまうのでしょうか。

###補足情報(言語/FW/ツール等のバージョンなど)
また、コンソールに
You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()
Test:.ctor()
Test:.cctor()
という警告も出ていますが、関係あるのでしょうか。

以上、まだUnityを始めたばかりの初心者であり、理解ができていない中の、拙い説明でございますが、ご教授お願いできませんでしょうか。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この処理の要点だけを簡略化すると以下のコードになります。

c#

1for(int i=0;i<2;++i) 2{ 3 Test.Instance.PostDay = i.ToString(); 4}

ボタンを押す前から既にTest.Instance.PostDayは2になってしまっているのです。
当然、1月1日のボタンを押しても既にTest.Instance.PostDayは2になってしまっているので関係ありません。

ですので、やらなくてはいけないのはボタンを押したら書き換えるか、ボタンごとに変数を保持するかです。

前者のやり方でやると以下のようなやり方になります。
うまくいく理由を説明するのはラムダ式の説明をちゃんとしないといけないので難しいです。

c#

1var tempMonth = month1; 2var tempDay = day1; 3button.onClick.AddListener(() => 4{ 5 Test.Instance.PostMonth = tempMonth; 6 Test.Instance.PostDay = tempDay; 7 SceneManager.LoadScene("NextScene"); 8}); 9

投稿2016/09/14 02:13

編集2016/09/14 02:17
ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hutax

2016/09/14 02:53

ishi9様 いつも回答ありがとうございます。 おかげさまで、なぜこのようなボタン処理となってしまうのか理解できました。 ご教授いただきましたソースコードを用いて起動したところ、無事正しい処理を行うことができました。 まだ始めたばかりのため、ラムダ式について今後学んでいきたいと考えています。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問