前提・実現したいこと
勝数と負け数をUnityUIのButtonでカウントして勝率をテキストに反映するスクリプトを作ろうとしているのですが、
カウントした後の計算結果をUnityのtextに反映させようとしても上手くいきません。
該当のソースコード
C#
ButtonController.cs //ボタンを押すとカウントするスクリプト
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ButtonController : BaseButtonController { public float WinCount = 0.0f; public float LoseCount = 0.0f; public float TotalCount = 0.0f; public float WinRate = 0.0f; protected override void OnClick(string objectName) { if("WinButton".Equals(objectName)) { this.WinButton(); } else if ("LoseButton".Equals(objectName)) { this.LoseButton(); } else { throw new System.Exception("Not implemented!"); } } // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private void WinButton() { WinCount++; TotalCount++; //勝数&試合数 WinRate = (WinCount * 100) / TotalCount; //勝率 string WR = WinRate.ToString("F1"); //小数点第1位まで表示 Debug.Log(WR + "%");//勝率の表示 } private void LoseButton() { LoseCount++; TotalCount++; //負け数&試合数 WinRate = (WinCount *100) / TotalCount;//勝率 string WR = WinRate.ToString("F1");//小数点第1位まで表示 Debug.Log(WR + "%");//勝率の表示 } }
WRManager.cs //textに文字を反映するスクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class WRManager : MonoBehaviour { public GameObject WR_object = null; public int WR_score = 0; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { //オブジェクトからTextコンポーネントを取得 Text WR_score = WR_object.GetComponent<Text>(); //テキストの表示を入れ替える WR_score.text = "000000"; } }
試したこと
リンクを参考に
上記のスクリプトでUnityのUITextに000000を反映することはできました。
この000000の部分をButtonController.csの変数であるWRを反映させようと色々な方法を試したのですが
エラーが出て上手くいきませんでした。
他のスクリプトの変数を参照する方法は以下の記事などを参考にしました
リンク
その際に見様見真似で書いたスクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class WRManager : MonoBehaviour { public GameObject WR_object = null; public int WR_score = 0; GameObject Text; ButtonController script; // Start is called before the first frame update void Start() { Text = GameObject.Find("Text"); script = Text.GetComponent<ButtonController>(); } // Update is called once per frame void Update() { //オブジェクトからTextコンポーネントを取得 Text WR_score = WR_object.GetComponent<Text>(); //テキストの表示を入れ替える WR_score.text = script.WR; } }
このスクリプトだと実行時に
NullReferenceException: Object reference not set to an instance of an object
WRManager.Update () (at Assets/WRManager.cs:32)
のエラーが出続ける現象が発生しました。
Unity,プログラミング含めて初心者で質問含め色々至らない部分だらけかと思いますがアドバイスのほどよろしくお願いします。
他にもっと良い方法や根本的に作り方が悪い、質問の仕方が悪いなどのご指摘もありましたら是非よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Unityのバージョンは2019.4.0f1です