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

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

ただいまの
回答率

88.23%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 774

syuteru64

score 13

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)

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

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Getdatestationname : MonoBehaviour
{
    public static string stationname;

    private Button gotanda;
    private Button meguro;
    private Button ebisu;
    private Button sibuya;
    private Button harazyuku;
    private Button yoyogi;
    private Button sinzyuku;
    private Button sinookubo;
    private Button takatdanobaba;
    private Button meziro;
    private Button ootuka;
    private Button sugamo;
    private Button komagome;
    private Button tabata;
    private Button nisinippori;
    private Button nippori;
    private Button uguisudani;
    private Button ueno;
    private Button akihabara;
    private Button kanda;
    private Button tokyou;
    private Button yuurakutyou;
    private Button sinbasi;
    private Button hamamatutyou;
    private Button tamati;
    private Button sinagawa;
    private Button oosaki;

    // Use this for initialization
    void Start ()
    {

        gotanda = GetComponent<Button>();
        meguro = GetComponent<Button>();
        ebisu = GetComponent<Button>();
        sibuya = GetComponent<Button>();
        harazyuku = GetComponent<Button>();
        yoyogi = GetComponent<Button>();
        sinzyuku = GetComponent<Button>();
        sinookubo = GetComponent<Button>();
        takatdanobaba = GetComponent<Button>();
        meziro = GetComponent<Button>();
        ootuka = GetComponent<Button>();
        sugamo = GetComponent<Button>();
        komagome = GetComponent<Button>();
        tabata = GetComponent<Button>();
        nisinippori = GetComponent<Button>();
        nippori = GetComponent<Button>();
        uguisudani = GetComponent<Button>();
        ueno = GetComponent<Button>();
        akihabara = GetComponent<Button>();
        kanda = GetComponent<Button>();
        tokyou = GetComponent<Button>();
        yuurakutyou = GetComponent<Button>();
        sinbasi = GetComponent<Button>();
        hamamatutyou = GetComponent<Button>();
        tamati = GetComponent<Button>();
        sinagawa = GetComponent<Button>();
        oosaki = GetComponent<Button>();

        gotanda.onClick.AddListener(OnClickButton);
        meguro.onClick.AddListener(OnClickButton);
        ebisu.onClick.AddListener(OnClickButton);
        sibuya.onClick.AddListener(OnClickButton);
        harazyuku.onClick.AddListener(OnClickButton);
        yoyogi.onClick.AddListener(OnClickButton);
        sinzyuku.onClick.AddListener(OnClickButton);
        sinookubo.onClick.AddListener(OnClickButton);
        takatdanobaba.onClick.AddListener(OnClickButton);
        meziro.onClick.AddListener(OnClickButton);
        ootuka.onClick.AddListener(OnClickButton);
        sugamo.onClick.AddListener(OnClickButton);
        komagome.onClick.AddListener(OnClickButton);
        tabata.onClick.AddListener(OnClickButton);
        nisinippori.onClick.AddListener(OnClickButton);
        nippori.onClick.AddListener(OnClickButton);
        uguisudani.onClick.AddListener(OnClickButton);
        ueno.onClick.AddListener(OnClickButton);
        akihabara.onClick.AddListener(OnClickButton);
        kanda.onClick.AddListener(OnClickButton);
        tokyou.onClick.AddListener(OnClickButton);
        yuurakutyou.onClick.AddListener(OnClickButton);
        sinbasi.onClick.AddListener(OnClickButton);
        hamamatutyou.onClick.AddListener(OnClickButton);
        tamati.onClick.AddListener(OnClickButton);
        sinagawa.onClick.AddListener(OnClickButton);
        oosaki.onClick.AddListener(OnClickButton);
    }

    // Update is called once per frame
    void Update ()
    {

    }
    public void OnClickButton()
    {
        Debug.Log("クリックされた");
        if (tag == "gotanda")
        {
            Debug.Log("五反田");
            stationname = "五反田";
        }
        if (tag == "meguro")
        {
            Debug.Log("目黒");
            stationname = "目黒";
        }
        if (tag == "ebisu")
        {
            Debug.Log("恵比寿");
            stationname = "恵比寿";
        }
        if (tag == "sibuya")
        {
            Debug.Log("渋谷");
            stationname = "渋谷";
        }
        if (tag == "harazyuku")
        {
            Debug.Log("原宿");
            stationname = "原宿";
        }
        if (tag == "yoyogi")
        {
            Debug.Log("代々木");
            stationname = "代々木";
        }
        if (tag == "sinzyuku")
        {
            Debug.Log("新宿");
            stationname = "新宿";
        }
        if (tag == "sinookubo")
        {
            Debug.Log("新大久保");
            stationname = "新大久保";
        }
        if (tag == "takadanobaba")
        {
            Debug.Log("高田馬場");
            stationname = "高田馬場";
        }
        if (tag == "meziro")
        {
            Debug.Log("目白");
            stationname = "目白";
        }
        if (tag == "ootuka")
        {
            Debug.Log("大塚");
            stationname = "大塚";
        }
        if (tag == "sugamo")
        {
            Debug.Log("巣鴨");
            stationname = "巣鴨";
        }
        if (tag == "komagome")
        {
            Debug.Log("駒込");
            stationname = "駒込";
        }
        if (tag == "tabata")
        {
            Debug.Log("田端");
            stationname = "田端";
        }
        if (tag == "nisinippori")
        {
            Debug.Log("西日暮里");
            stationname = "西日暮里";
        }
        if (tag == "nippori")
        {
            Debug.Log("日暮里");
            stationname = "日暮里";
        }
        if (tag == "uguisudani")
        {
            Debug.Log("鶯谷");
            stationname = "鶯谷";
        }
        if (tag == "ueno")
        {
            Debug.Log("上野");
            stationname = "上野";
        }
        if (tag == "okatimati")
        {
            Debug.Log("御徒町");
            stationname = "御徒町";
        }
        if (tag == "akihabara")
        {
            Debug.Log("秋葉原");
            stationname = "秋葉原";
        }
        if (tag == "kanda")
        {
            Debug.Log("神田");
            stationname = "神田";
        }
        if (tag == "tokyou")
        {
            Debug.Log("東京");
            stationname = "東京";
        }
        if (tag == "yuurakutyou")
        {
            Debug.Log("有楽町");
            stationname = "有楽町";
        }
        if (tag == "sinbasi")
        {
            Debug.Log("新橋");
            stationname = "新橋";
        }
        if (tag == "hamamatutyou")
        {
            Debug.Log("浜松町");
            stationname = "浜松町";
        }
        if (tag == "tamati")
        {
            Debug.Log("田町");
            stationname = "田町";
        }
        if (tag == "sinagawa")
        {
            Debug.Log("品川");
            stationname = "品川";
        }
        if (tag == "oosaki")
        {
            Debug.Log("大崎");
            stationname = "大崎";
        }
        Debug.Log(stationname);
    }
    public static string getStationname()
    {
        return stationname;
    }
}
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Union : MonoBehaviour
{

    Getdatestationname data1;
    Getdatestationname2 data2;
    // Use this for initialization
    void Start ()
    {
        string data1 = Getdatestationname.getStationname();
        string data2 = Getdatestationname2.getStationname2();
    }

    // Update is called once per frame
    void Update ()
    {
        this.GetComponent<Text>().text = "aaa" + data1.ToString() + data2.ToString();

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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


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

public class Union : MonoBehaviour
{
    //stringで受け取りたいのでGetdatestationnameクラスではなくstring型に変更
    string data1;
    string data2;

    // Use this for initialization
    void Start ()
    {
        //ローカル変数定義ではなくクラス変数に入れる
        data1 = Getdatestationname.getStationname();
        data2 = Getdatestationname2.getStationname2();
    }

    // Update is called once per frame
    void Update ()
    {
        //stringに対して.ToString()は無駄なので消した
        this.GetComponent<Text>().text = "aaa" + data1 + data2;

    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/27 18:00

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

    キャンセル

  • 2018/09/27 20: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=デバッグではない)
    混乱を招くのでこれを機に「代入」「参照」等の言葉を正しく認識出来ているか確認してもらえると助かります。

    キャンセル

  • 2018/09/28 10:33

    sakura_hanaさん
    丁寧に説明していただきありがとうございます。
    なるほど、GetComponent<Button>().onClick.AddListener(OnClickButton);を使えば手動でやらなくていいのですね。

    今回は、sakura_hanaさんが書いてくれたscriptでやってみたら、動きました。
    正確には自分が付けていた別scriptが処理を邪魔して、そのscriptを無効にしたらDebug.Logも反応しました。

    今回もお世話になりました。また機会があればよろしくお願いします。

    キャンセル

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

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る