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

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

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

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

Q&A

1回答

4634閲覧

Unity textに他スクリプトの変数を反映する方法

RIPmomiji

総合スコア0

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

0グッド

0クリップ

投稿2020/06/21 03:25

編集2020/06/22 02:13

前提・実現したいこと

勝数と負け数を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です

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

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

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

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

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

sakura_hana

2020/06/22 00:51 編集

「NullReferenceException」は頻出質問です。このサイト内で探すだけでも類型がいっぱいあります。まず自分で調べてください。 (恐らく"Text"というGameObjectにButtonControllerが付与されていないと思われます) また、質問文でスクリプトは上下の行に「```」を入力してください。 詳しくはこちらをご覧ください。→https://teratail.com/help/question-tips
RIPmomiji

2020/06/22 01:44

ありがとうございます、参考にさせて頂きます!
guest

回答1

0

このスクリプトだと実行時に
NullReferenceException: Object reference not set to an instance of an object
WRManager.Update () (at Assets/WRManager.cs:32)
のエラーが出続ける現象が発生しました。

WRManager.cs の 32 行目でエラーが出ています。それは

WR_score.text = script.WR;

です。
WR_score か script のどちらかが null だということです。まずはどちらが null なのか(両方かもしれない)を調べて、どちらが null なのか(あるいは両方 null なのか)を確定させなければいけません。

投稿2020/06/23 07:35

bboydaisuke

総合スコア5275

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

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

RIPmomiji

2020/06/23 14:14 編集

回答ありがとうございます。 参考にさせて頂き、if文でscriptのnullチェックをしたところ、ご指摘の通りscriptがnullになってました。 ``` Text = GameObject.Find("Text"); script = Text.GetComponent<ButtonController>(); ``` を修正して ``` Text = GameObject.Find("WR_object"); script = WR_object.GetComponent<ButtonController>(); ``` に変更したところ NullReferenceException: Object reference not set to an instance of an object WRManager.Update () (at Assets/WRManager.cs:32) のエラーは解消されました。 しかしながらscript.WRが取得されずGameSceneのtextには何も表示されない状態になってしまっているので その部分をもう一度見直そうと思います。 gameObjectのtextからWR_objectになっていたのは解決方法を探す中で変更していたようです。 情報が曖昧で申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問