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

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

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

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

Q&A

解決済

1回答

255閲覧

Unityでsceneをまたいで変数を使いたい

syuteru64

総合スコア16

Unity

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

0グッド

0クリップ

投稿2018/09/26 06:03

Unityでsceneをまたいで変数(string型)を使いたいのですが、中身がうまく反映されずNullが入りUnity上では何も表示されません。
ソースは以下の通りです。(プログラムの定義量が多いためGetdatastationname2はGetdatastationnameとあまり変わらずstationname2があるため割愛させていただきます)
Getdatastationname、Getdatastationname2の二つのscriptからTagに対応している文字列をstationname、stationname2に代入しUnionでdata1、data2に値を代入しUnityにあるtextに出力したいのですがなぜかNullが入っているというエラー文が出てきます。
エラー文
NullReferenceException: Object reference not set to an instance of an object
Union.Update () (at Assets/script/Union.cs:20)

これはどうしたら出力できるようになるのでしょうか。
ご回答よろしくお願いします。

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4 5public class Getdatestationname : MonoBehaviour 6{ 7 public static string stationname; 8 9 private Button gotanda; 10 private Button meguro; 11 private Button ebisu; 12 private Button sibuya; 13 private Button harazyuku; 14 private Button yoyogi; 15 private Button sinzyuku; 16 private Button sinookubo; 17 private Button takatdanobaba; 18 private Button meziro; 19 private Button ootuka; 20 private Button sugamo; 21 private Button komagome; 22 private Button tabata; 23 private Button nisinippori; 24 private Button nippori; 25 private Button uguisudani; 26 private Button ueno; 27 private Button akihabara; 28 private Button kanda; 29 private Button tokyou; 30 private Button yuurakutyou; 31 private Button sinbasi; 32 private Button hamamatutyou; 33 private Button tamati; 34 private Button sinagawa; 35 private Button oosaki; 36 37 // Use this for initialization 38 void Start () 39 { 40 41 gotanda = GetComponent<Button>(); 42 meguro = GetComponent<Button>(); 43 ebisu = GetComponent<Button>(); 44 sibuya = GetComponent<Button>(); 45 harazyuku = GetComponent<Button>(); 46 yoyogi = GetComponent<Button>(); 47 sinzyuku = GetComponent<Button>(); 48 sinookubo = GetComponent<Button>(); 49 takatdanobaba = GetComponent<Button>(); 50 meziro = GetComponent<Button>(); 51 ootuka = GetComponent<Button>(); 52 sugamo = GetComponent<Button>(); 53 komagome = GetComponent<Button>(); 54 tabata = GetComponent<Button>(); 55 nisinippori = GetComponent<Button>(); 56 nippori = GetComponent<Button>(); 57 uguisudani = GetComponent<Button>(); 58 ueno = GetComponent<Button>(); 59 akihabara = GetComponent<Button>(); 60 kanda = GetComponent<Button>(); 61 tokyou = GetComponent<Button>(); 62 yuurakutyou = GetComponent<Button>(); 63 sinbasi = GetComponent<Button>(); 64 hamamatutyou = GetComponent<Button>(); 65 tamati = GetComponent<Button>(); 66 sinagawa = GetComponent<Button>(); 67 oosaki = GetComponent<Button>(); 68 69 gotanda.onClick.AddListener(OnClickButton); 70 meguro.onClick.AddListener(OnClickButton); 71 ebisu.onClick.AddListener(OnClickButton); 72 sibuya.onClick.AddListener(OnClickButton); 73 harazyuku.onClick.AddListener(OnClickButton); 74 yoyogi.onClick.AddListener(OnClickButton); 75 sinzyuku.onClick.AddListener(OnClickButton); 76 sinookubo.onClick.AddListener(OnClickButton); 77 takatdanobaba.onClick.AddListener(OnClickButton); 78 meziro.onClick.AddListener(OnClickButton); 79 ootuka.onClick.AddListener(OnClickButton); 80 sugamo.onClick.AddListener(OnClickButton); 81 komagome.onClick.AddListener(OnClickButton); 82 tabata.onClick.AddListener(OnClickButton); 83 nisinippori.onClick.AddListener(OnClickButton); 84 nippori.onClick.AddListener(OnClickButton); 85 uguisudani.onClick.AddListener(OnClickButton); 86 ueno.onClick.AddListener(OnClickButton); 87 akihabara.onClick.AddListener(OnClickButton); 88 kanda.onClick.AddListener(OnClickButton); 89 tokyou.onClick.AddListener(OnClickButton); 90 yuurakutyou.onClick.AddListener(OnClickButton); 91 sinbasi.onClick.AddListener(OnClickButton); 92 hamamatutyou.onClick.AddListener(OnClickButton); 93 tamati.onClick.AddListener(OnClickButton); 94 sinagawa.onClick.AddListener(OnClickButton); 95 oosaki.onClick.AddListener(OnClickButton); 96 } 97 98 // Update is called once per frame 99 void Update () 100 { 101 102 } 103 public void OnClickButton() 104 { 105 Debug.Log("クリックされた"); 106 if (tag == "gotanda") 107 { 108 Debug.Log("五反田"); 109 stationname = "五反田"; 110 } 111 if (tag == "meguro") 112 { 113 Debug.Log("目黒"); 114 stationname = "目黒"; 115 } 116 if (tag == "ebisu") 117 { 118 Debug.Log("恵比寿"); 119 stationname = "恵比寿"; 120 } 121 if (tag == "sibuya") 122 { 123 Debug.Log("渋谷"); 124 stationname = "渋谷"; 125 } 126 if (tag == "harazyuku") 127 { 128 Debug.Log("原宿"); 129 stationname = "原宿"; 130 } 131 if (tag == "yoyogi") 132 { 133 Debug.Log("代々木"); 134 stationname = "代々木"; 135 } 136 if (tag == "sinzyuku") 137 { 138 Debug.Log("新宿"); 139 stationname = "新宿"; 140 } 141 if (tag == "sinookubo") 142 { 143 Debug.Log("新大久保"); 144 stationname = "新大久保"; 145 } 146 if (tag == "takadanobaba") 147 { 148 Debug.Log("高田馬場"); 149 stationname = "高田馬場"; 150 } 151 if (tag == "meziro") 152 { 153 Debug.Log("目白"); 154 stationname = "目白"; 155 } 156 if (tag == "ootuka") 157 { 158 Debug.Log("大塚"); 159 stationname = "大塚"; 160 } 161 if (tag == "sugamo") 162 { 163 Debug.Log("巣鴨"); 164 stationname = "巣鴨"; 165 } 166 if (tag == "komagome") 167 { 168 Debug.Log("駒込"); 169 stationname = "駒込"; 170 } 171 if (tag == "tabata") 172 { 173 Debug.Log("田端"); 174 stationname = "田端"; 175 } 176 if (tag == "nisinippori") 177 { 178 Debug.Log("西日暮里"); 179 stationname = "西日暮里"; 180 } 181 if (tag == "nippori") 182 { 183 Debug.Log("日暮里"); 184 stationname = "日暮里"; 185 } 186 if (tag == "uguisudani") 187 { 188 Debug.Log("鶯谷"); 189 stationname = "鶯谷"; 190 } 191 if (tag == "ueno") 192 { 193 Debug.Log("上野"); 194 stationname = "上野"; 195 } 196 if (tag == "okatimati") 197 { 198 Debug.Log("御徒町"); 199 stationname = "御徒町"; 200 } 201 if (tag == "akihabara") 202 { 203 Debug.Log("秋葉原"); 204 stationname = "秋葉原"; 205 } 206 if (tag == "kanda") 207 { 208 Debug.Log("神田"); 209 stationname = "神田"; 210 } 211 if (tag == "tokyou") 212 { 213 Debug.Log("東京"); 214 stationname = "東京"; 215 } 216 if (tag == "yuurakutyou") 217 { 218 Debug.Log("有楽町"); 219 stationname = "有楽町"; 220 } 221 if (tag == "sinbasi") 222 { 223 Debug.Log("新橋"); 224 stationname = "新橋"; 225 } 226 if (tag == "hamamatutyou") 227 { 228 Debug.Log("浜松町"); 229 stationname = "浜松町"; 230 } 231 if (tag == "tamati") 232 { 233 Debug.Log("田町"); 234 stationname = "田町"; 235 } 236 if (tag == "sinagawa") 237 { 238 Debug.Log("品川"); 239 stationname = "品川"; 240 } 241 if (tag == "oosaki") 242 { 243 Debug.Log("大崎"); 244 stationname = "大崎"; 245 } 246 Debug.Log(stationname); 247 } 248 public static string getStationname() 249 { 250 return stationname; 251 } 252} 253

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4 5public class Union : MonoBehaviour 6{ 7 8 Getdatestationname data1; 9 Getdatestationname2 data2; 10 // Use this for initialization 11 void Start () 12 { 13 string data1 = Getdatestationname.getStationname(); 14 string data2 = Getdatestationname2.getStationname2(); 15 } 16 17 // Update is called once per frame 18 void Update () 19 { 20 this.GetComponent<Text>().text = "aaa" + data1.ToString() + data2.ToString(); 21 22 } 23} 24

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

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

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

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

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

guest

回答1

0

ベストアンサー

Unionクラスの方、
クラス変数としてGetdatestationname data1;してますが、
Startの中でstring data1 = 〜とローカル変数を再定義しています(=クラス変数とは別の変数)。

Updateの中のdata1はクラス変数(Getdatestationnameの方)で、こいつは代入されている箇所が無いので当然ながらnullです。


コメントを受けて修正したソースを記載。
ちなみにGetdatestationnameが正常動作してるかは未確認です。

C#

1public class Union : MonoBehaviour 2{ 3 //stringで受け取りたいのでGetdatestationnameクラスではなくstring型に変更 4 string data1; 5 string data2; 6 7 // Use this for initialization 8 void Start () 9 { 10 //ローカル変数定義ではなくクラス変数に入れる 11 data1 = Getdatestationname.getStationname(); 12 data2 = Getdatestationname2.getStationname2(); 13 } 14 15 // Update is called once per frame 16 void Update () 17 { 18 //stringに対して.ToString()は無駄なので消した 19 this.GetComponent<Text>().text = "aaa" + data1 + data2; 20 21 } 22}

投稿2018/09/26 06:21

編集2018/09/26 09:52
sakura_hana

総合スコア11427

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

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

syuteru64

2018/09/26 07:56

sakura_hanaさん すみません、理解力が足りないようで... つまりクラス変数のGetdatastationnameクラスでreturnした変数の中身をUnionクラスで呼び出すにはどうしたらいいのでしょうか。
sakura_hana

2018/09/26 09:53

メソッドの呼び出しは正しく出来ているけれども、それを入れた先の変数の取り扱いが違っているね、というお話かと。(回答編集しました)
syuteru64

2018/09/27 02:20

sakura_hanaさん 一応Unionの方のプログラムを変えてみたのですが、やはり違うsceneで文字列が出力されません。 Getdatastationnameの方が動いてない可能性は無いとは言い切れないのですが、そもそもUnionの方のUpdate内で宣言しているthis.GetComponent<Texst>().text = "aaa" + data1 + data2; と書いてある部分があるのですが、this.GetComponent<Texst>().text = "aaa" + data1 + data2;ではもしdata1、data2内がNullだった場合でも"aaa"は出力されると思うのですが”aaa”すら出力されませんこれはthis.GetComponent<Texst>().text = "aaa" + data1 + data2;で宣言している宣言の仕方が悪いのでしょうか それともUnionを付けているところが悪いのでしょうか ちなみにUnionはCanvas内のImageにUnionコードを付けています。
syuteru64

2018/09/27 02:27

sakura_hanaさん 追加ですみません”aaa”の方は出力されましたあれはCanvas内のImage内のtextに付けなければいけなかったのですね… それで、話は戻るのですが、Union内のdata1、data2は先ほど言われた通り修正はしてみたのですがやはりNullしか入っていないといわれてしまします。 この場合ですと考えられるのはGetdatastationname内でreturnされている物がないということでしょうか。 それともsceneが変わってしまうと値が渡せないのでしょうか。
sakura_hana

2018/09/27 04:40

staticを使う限りシーン跨ぎは問題無いはず。 疑うなら「そもそも駅名ボタンを押した時(シーンが変わる前)にstationnameが正しく代入されていない」の方かと。 Getdatestationnameはオブジェクトにどう付けてますか? Getdatestationnameをボタン全てに付与して動作させてるなら正常に動くと思いますが、スクリプトを見た感じそういう意図でないように思います。 Buttonコンポーネントは1オブジェクト1つなので五反田も目黒も恵比寿も同じButtonコンポーネント(自身に付いたButton)を見ていることになるので、別々の変数に入れる意味が無いです。 また、OnClickButton()内のtagも結果的に「Getdatestationnameが付いたオブジェクトのタグ」を見ているので、条件分岐に当てはまらなければstationnameは初期値(=null)のままです。 タグはオブジェクトをグルーピングする為のものなので、(意図があってそうしているのでなければ)今回の用途には向かないように思います。 もし私がやるとしたらこんな感じかと(もっといい方法あるかもですが)。 1. Getdatestationnameを以下のように変更。 2. 各ButtonオブジェクトにGetdatestationnameをアタッチ。 3. 各ButtonオブジェクトのmyNameをインスペクタから設定。 (タグの指定は何もしない) public class Getdatestationname : MonoBehaviour { public static string stationname; public string myName; void Start () { GetComponent<Button>().onClick.AddListener(OnClickButton); } public void OnClickButton() { stationname = myName; Debug.Log(stationname); } public static string getStationname() { return stationname; } }
syuteru64

2018/09/27 05:55

sakura_hanaさん なるほど、GetComponent<Button>でボタン一つ一つの情報を得るわけですね。 その後OnClickButton()内でstationname=myNameでstationnameにmyNameの中身を入れるのですね。 その後returnで値を返すという流れですか… 確かにこの方が短いですしわかりやすいですね、しかし今回はstationnameにデータを入れるだけではなく、stationnameに入っているデータを取り出しUnionでstationname内の名前とTagが一致している物を参照し、その二つを使って最終的に乗った駅(stationname)と降りた駅(stationname2)を出力したいのです。
sakura_hana

2018/09/27 06:37 編集

>Unionでstationname内の名前とTagが一致している物を参照し これがよく分かりません。 stationnameはstringなので名前とタグは存在しません、データといっても文字列しかありません(例えばstringからGameObjectは直接取得出来ません)。 「選択されたGetdatestationnameクラス」のことを指しているつもりなら、それを求める/代入するスクリプトはどこにも無いのでシーンを跨ごうが跨ぐまいが取得しようがありません。 あとわざわざ名前とタグを参照しなくても、Unionの時点では Getdatestationname.getStationname()が乗った駅名 Getdatestationname2.getStationname()が降りた駅名 になるのではないでしょうか。 ・どのオブジェクトに何のスクリプトが付いているか ・駅のボタンが押された時のスクリプトの流れ ・シーン遷移後のスクリプトの流れ を日本語でいいので記述すると整頓出来るのではないかと思います。
syuteru64

2018/09/27 07:46

sakura_hanaさん なるほど、参考になります。 作っていると混乱することが多いので次回からはメモ帳か何かにやりたいこと、できる事とかをまとめておきます。 いつも長々とした質問に答えていただきありがとうございます。
syuteru64

2018/09/27 09:00

sakura_hanaさん すみません、ついでに教えてほしいのですがsakura_hanaさんに書いていただいたscriptをボタンに対応させたいのですが、ネットで調べたやり方でcanvas内のbuttonにあるOnclickにscriptを付ければいいと書いてあったのですが、そのやり方でやってみたのですが、うまく動きません。 sakura_hanaさんのscriptを自分なりに解釈してみたのですが、このscriptはstart内でOnclickbuttonを呼び出している。流れからいえばstart関数でOnclickbuttonを呼び、ボタンが押されたら、Onclickbutton関数を呼ぶ。その後myNameにstationnameを呼び出していると思うのですが… どうでしょうか、また、Debug.Logでstationnameを表示していると思うのですがボタンをクリックしてもデバックされないのはなぜでしょう。 ついでで申し訳ないのですが教えていただけると幸いです。
sakura_hana

2018/09/27 11:27

前述の手順1,2,3以外要りません。 「canvas内のbuttonにあるOnclickにscriptを付ければいい」 上記は手動で設定する場合で、今回は GetComponent<Button>().onClick.AddListener(OnClickButton); がその役目を果たすので不要な操作です。 (ご自分でも使われているので理解されているのだと思ったのですが……) クリックしてもデバッグされないとのことですが、一度私の書いた通りにしてみてください。 Startメソッドでしているのは「自分のオブジェクトのButtonのOnClickにOnClickButtonを登録する(=ボタンが押されたらOnClickButtonメソッドが呼ばれるようにする)」。 ボタンが押されたらOnClickButtonメソッドが呼ばれる。 OnClickButtonでは stationname = myName;が「stationnameにmyNameの中身を代入する(例えばmyNameが「五反田」ならstationnameを「五反田」にする)」 Debug.Log(stationname);が「コンソールにstationnameを表示させる(前述の例なら「五反田」と表示される)」。 「myNameにstationnameを呼び出している」「デバッグされない」とか、認識が異なるか、認識は合っているけれど言い回しが普通と違うように思います。 (呼び出すのはメソッドであって、変数を呼び出すとはあまり言わない。デバッグはバグを探す行為で、Debug.Logは「ログを表示する」メソッドなので、Debug.Log=デバッグではない) 混乱を招くのでこれを機に「代入」「参照」等の言葉を正しく認識出来ているか確認してもらえると助かります。
syuteru64

2018/09/28 01:33

sakura_hanaさん 丁寧に説明していただきありがとうございます。 なるほど、GetComponent<Button>().onClick.AddListener(OnClickButton);を使えば手動でやらなくていいのですね。 今回は、sakura_hanaさんが書いてくれたscriptでやってみたら、動きました。 正確には自分が付けていた別scriptが処理を邪魔して、そのscriptを無効にしたらDebug.Logも反応しました。 今回もお世話になりました。また機会があればよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問