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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

14528閲覧

【Unity】InputFieldで得た数値の計算結果を配置済みのTextコンポーネントに表示したい

hogehoge0827

総合スコア17

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2016/08/13 11:38

編集2016/08/17 16:10

###前提・実現したいこと
①Unityにおいて、InputFieldで得た数値(入力1と入力2)の合計値を算出
②計算結果をuGUIのTextコンポーネントに表示させたい

###発生している問題・エラーメッセージ
超絶初心者で申し訳ございません。JavaやC#を1年ほど週末趣味でやってきて、ようやくUnityに挑戦するぞ、となったものの、いきなり躓いております。

そもそも合計値を算出できているか否かすら不明です。Debug.Logでも出てきません。
uGUIで出したTextコンポーネントに計算結果を代入して出力する方法を数日書けて調べたのですが、いくら調べてもわかりません。
(Textコンポーネントはその場でスクリプトで生成するものではなく、予め設置してあるものを使用したい)

エラーメッセージ
UnityException: You are not allowed to call this function when declaring a variable.
Move it to the line after without a variable declaration.
If you are using C# don't use this function in the constructor or field initializers, Instead move initialization to the Awake or Start function.
Calc..ctor ()

Find can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
UnityEngine.GameObject:Find(String)
Calc:.ctor()

ArgumentException: Find can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
Calc..ctor ()

###該当のソースコード
C#(Calc.cs)

using UnityEngine;
using System;
using UnityEngine.UI;

public class Calc : MonoBehaviour
{
public int total; //合計金額

//入力されたテキストを受け取ってコンソールにログを吐き出す public void ValueChange(string text) { Debug.Log(text); } //InputFieldに入力されたものを受け取る。受け取る時の形式はテキスト。 Text textInput1 = GameObject.Find("FieldInput1_Text").GetComponent<Text>(); Text textInput2 = GameObject.Find("FieldInput2_Text").GetComponent<Text>(); //テキストを数値に変換 public int input1 = int.Parse("FieldInput1_Text"); public int input2 = int.Parse("FieldInput2_Text"); //合計値を算出 public void CalcTotal() { int total = input1 + input2; Debug.Log(total); }

}

###試したこと
Textボックスではなく、InputFieldに出力してみようともしてみたのですが、ダメでした。

###補足情報(言語/FW/ツール等のバージョンなど)
Unity5.3.5f1

InputFieldで入力されたTextを取り込む方法は主にこちらを参考にしました。
しかし、出力する方法が一向に分かりません。。。
http://www.peliphilo.net/archives/1040

TextFieldをスクリプトで生成して表示させる方法は、最終的な出力のイメージが異なっております。また、足し算の結果は相変わらず出力できませんでした。
http://techacademy.jp/magazine/4198

何卒、よろしくお願い申し上げます。

Hierarchyの状況

###修正済み完成コード
using UnityEngine;
using System;
using UnityEngine.UI;

public class Calc : MonoBehaviour
{
//★合計金額表示用のText用変数
public Text TotalText;

//InputFieldに入力されたものを受け取る。受け取る時の形式はInputField InputField textInput1; InputField textInput2; void Start() { //Textコンポーネントの取得は最初の一度だけでいいので、Start内で行う textInput1 = GameObject.Find("FieldInput1").GetComponent<InputField>();//「("FieldInput1_Text")」ではなく「("FieldInput1")」。FieldInput1_TextオブジェクトにはInputFieldが付いていない。「("Canvas/FieldInput1")」でもOK。 textInput2 = GameObject.Find("FieldInput2").GetComponent<InputField>(); //★TotalTextに出力するにはvoid Start(){}内でGameObjectを宣言しておく必要がある。これがあれば、一番下の「TotalText.text = Total.ToString();」がNull Reference Exceptionにならない。 //★詳しくは「http://docs.unity3d.com/ja/current/Manual/ControllingGameObjectsComponents.html」を参照 TotalText = GameObject.Find("TotalText").GetComponent< Text > (); } //入力されたテキストを受け取ってコンソールにログを吐き出す public void ValueChange(string text) { //★HierarchyのFieldInput1にCalc.csをAddComponentし、On Value Changedを+し、FieldInput1をドラッグ&ドロップ1し、プルダウンでCalc>ValueChangeを選択 //★On End Editも+し、FieldInput1をドラッグ&ドロップ1し、プルダウンでCalc>CalcTotal()を選択 //★HierarchyのFieldInput2にCalc.csをAddComponentし、On Value Changedを+し、FieldInput2をドラッグ&ドロップ1し、プルダウンでCalc>ValueChangeを選択 //★On End Editも+し、FieldInput2をドラッグ&ドロップ1し、プルダウンでCalc>CalcTotal()を選択 Debug.Log(textInput1); //textInput1を受け取れているか否かの確認 Debug.Log(textInput2); //textInput2を受け取れているか否かの確認 } //合計値を算出 public void CalcTotal() { //テキストを数値に変換 int input1 = int.Parse(textInput1.text); int input2 = int.Parse(textInput2.text); //int型+int型=int型です、ValueChangeのデバッグログと見比べてみてください int Total = input1 + input2; //Totalはローカル変数 Debug.Log(Total); //計算結果をとりあえずFieldInput1_Textに戻します //.textはstring型なので、int型をそのまま入れるとエラーを起こします //int型の変数の後ろに.ToString()を付けるとstring型に変換されます(←ここポイント) //.ToString()の代わりに「+ ""」でもstring型になります //textInput1.text = total.ToString(); //★計算結果をTextコンポーネントに出力するために変更 //合計金額を出力するTextコンポーネント「TotalOutput」にCalc.csをAddComponent //InspectorのTotalTextにHierarchyからTotalOutputをドラッグ&ドロップ TotalText.text = Total.ToString();//intのTotalをToStringでString化して、TotalTextに代入 }

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

■TextとInputFieldの使い方
Textはテキストコンポーネントを指しますが、Textの中に入力された文字列は「Textコンポーネント内のtext変数」に入っています。
なのでtextInput1.textと取得します。
getもsetも両方使える変数なので、出力する時もtextInput1.text = "ほにゃらら";で出来ます。

但し、上記は通常のTextだけを使用している場合です。
InputFieldを使用している場合はInputFieldのtext変数を使いましょう。理由は以下のページにて。
Unity公式マニュアル:Input Field

■変数の定義
メソッドの外でGetComponentやint.Parseのようなメソッドは使えません。
何らかのメソッドの中で記載する必要があります。

■文字列と変数の違い
int.Parse("FieldInput1_Text");はこのままだと「FieldInput1_Textという文字列をintに変換する」という命令になります。
ダブルコーテーションで囲まれた文字列はそのまま文字列(string)として扱われ、囲まれていない文字列は変数として扱われます。

以上を踏まえると以下のようになります。

C#

1using UnityEngine; 2using System; 3using UnityEngine.UI; 4public class Calc : MonoBehaviour 5{ 6public int total;   //合計金額 7//InputFieldに入力されたものを受け取る。受け取る時の形式はInputField。 8InputField textInput1; 9InputField textInput2; 10 11void Start () { 12//Textコンポーネントの取得は最初の一度だけでいいのでStart内で行います。 13//GameObject名は適宜直してください 14textInput1 = GameObject.Find("FieldInput1_Text").GetComponent<InputField>(); 15textInput2 = GameObject.Find("FieldInput2_Text").GetComponent<InputField>(); 16} 17 18//入力されたテキストを受け取ってコンソールにログを吐き出す 19public void ValueChange(string text) 20{ 21//とりあえずtextInput1とtextInput2を並べて表示します 22//.textはstring型です。+で繋げると横に並べたように表示されます 23//例:textInput1の入力値が1、textInput2が2なら「1 2」と表示 24Debug.Log(textInput1.text + “ “ + textInput2.text); 25} 26//合計値を算出 27public void CalcTotal() 28{ 29//テキストを数値に変換 30int input1 = int.Parse(textInput1.text); 31int input2 = int.Parse(textInput2.text); 32 33//int型+int型=int型です、ValueChangeのデバッグログと見比べてみてください 34int total = input1 + input2; 35Debug.Log(total); 36 37//計算結果をとりあえずFieldInput1_Textに戻します 38//.textはstring型なので、int型をそのまま入れるとエラーを起こします 39//int型の変数の後ろに.ToString()を付けるとstring型に変換されます 40//.ToString()の代わりに「+ ""」でもstring型になります 41textInput1.text = total.ToString(); 42} 43}

■おまけ
「型が違う変数を四則演算した結果の型」は覚えておくといいかもしません。
今回は関係無いですが「float型×int型=int型」とかは知らないでいると痛い目見たりします(小数点以下まで欲しいのに勝手に切り落とされる為)。

投稿2016/08/13 15:46

sakura_hana

総合スコア11427

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

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

hogehoge0827

2016/08/14 17:01 編集

sakura_hanaさん、詳細なご説明ありがとうございました。私自身、基本が全くできていないことを痛感いたしました。。。 さて、だいぶ前進した感じなのですが、ちょっと、まだ、動かないようです。 下記のDebug.Logを出力させるところ「Debug.Log(textInput1.text + " " + textInput2.text);」でエラーが出てしまい、入力された数値が併記されません。 Debug.Log(text);に戻すと一応入力は取れているようです。 また、合計値 int total = input1 + input2; Debug.Log(total); も出力されません。 大変申し訳ございませんが、何卒、ご指導いただけたらと思います。(コメントの頭に★が付いている行を自ら追記しました) using UnityEngine; using System; using UnityEngine.UI; public class Calc : MonoBehaviour { public string totalOutput; //★合計金額のText用変数 public int total = 0; //合計金額計算用変数 //InputFieldに入力されたものを受け取る。受け取る時の形式はInputField InputField textInput1; InputField textInput2; //★HierarchyのFieldInput1にCalc.csをAddComponentし、TotalTextにTotalOutputをドラッグ&ドロップする //★HierarchyのFieldInput2にCalc.csをAddComponentし、TotalTextにTotalOutputをドラッグ&ドロップする void Start() { //Textコンポーネントの取得は最初の一度だけでいいので、Start内で行う //GameObject名は適宜直す textInput1 = GameObject.Find("FieldInput1_Text").GetComponent<InputField>(); textInput2 = GameObject.Find("FieldInput2_Text").GetComponent<InputField>(); } //入力されたテキストを受け取ってコンソールにログを吐き出す public void ValueChange(string text) { //とりあえずtextInput1とtextInput2を並べて表示します //.textはstring型です。+で繋げると横に並べたように表示されます //例:textInput1の入力値が1、textInput2が2なら「1 2」と表示 //Debug.Log(textInput1.text + " " + textInput2.text); //Debug.Log(text);から変更 Debug.Log(text); } //合計値を算出 public void CalcTotal() { //テキストを数値に変換 int input1 = int.Parse(textInput1.text); int input2 = int.Parse(textInput2.text); //int型+int型=int型です、ValueChangeのデバッグログと見比べてみてください int total = input1 + input2; Debug.Log(total); //計算結果をとりあえずFieldInput1_Textに戻します //.textはstring型なので、int型をそのまま入れるとエラーを起こします //int型の変数の後ろに.ToString()を付けるとstring型に変換されます(←ここポイント) //.ToString()の代わりに「+ ""」でもstring型になります //textInput1.text = total.ToString(); //★計算結果をTextコンポーネントに出力するために変更 //合計金額を出力するTextコンポーネント「TotalOutput」にCalc.csをAddComponent //InspectorのTotalTextにHierarchyからTotalOutputをドラッグ&ドロップ totalOutput = total.ToString(); //intのtotalをToStringでString化して、totalOutputに代入 } } エラーメッセージ Debug.Log(textInput1.text + " " + textInput2.text);を入れてしまうと出てくるエラー NullReferenceException: Object reference not set to an instance of an object Calc.ValueChange (System.String text) (at Assets/Scripts/Calc.cs:31) UnityEngine.Events.InvokableCall`1[System.String].Invoke (System.Object[] args) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:184) UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:630) UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:765) UnityEngine.Events.UnityEvent`1[T0].Invoke (.T0 arg0) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_1.cs:53) UnityEngine.UI.InputField.SendOnValueChanged () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/InputField.cs:1448) UnityEngine.UI.InputField.Insert (Char c) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/InputField.cs:1436) UnityEngine.UI.InputField.Append (Char input) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/InputField.cs:1503) UnityEngine.UI.InputField.KeyPressed (UnityEngine.Event evt) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/InputField.cs:1083) UnityEngine.UI.InputField.OnUpdateSelected (UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/InputField.cs:1129) UnityEngine.EventSystems.ExecuteEvents.Execute (IUpdateSelectedHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:101) UnityEngine.EventSystems.ExecuteEvents.Execute[IUpdateSelectedHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269) UnityEngine.EventSystems.EventSystem:Update() 2つの入力した数字を足して表示するだけで、こんなに難しいなんて・・・
hogehoge0827

2016/08/14 17:20 編集

吉谷 幹人「Unity5 3D/2Dゲーム開発 実践入門 作りながら覚えるスマートフォンゲーム制作」のフラッピーアザラシのスコアの表示のさせ方を参考に頑張ってみたのですが、ダメでした。フラッピーアザラシのスコアは非常にシンプルで、コード量も少なく、シーンデータの方でも特に設定はされていないようでした。が、これを真似しても相変わらず計算結果は表示されませんでした。。。 参考URL http://www.socym.co.jp/support/s-967#ttlDownload スコアに関係のあるC#スクリプト(GameController.cs) using UnityEngine; using UnityEngine.UI; using System.Collections; public class GameController : MonoBehaviour { // ゲームステート enum State { Ready, Play, GameOver } State state; int score; public AzarashiController azarashi; public GameObject blocks; public Text scoreLabel; public Text stateLabel; void Start () { // 開始と同時にReadyステートに移行 Ready(); } void LateUpdate () { // ゲームのステートごとにイベントを監視 switch (state) { case State.Ready: // タッチしたらゲームスタート if (Input.GetButtonDown("Fire1")) GameStart(); break; case State.Play: // キャラクターが死亡したらゲームオーバー if (azarashi.IsDead()) GameOver(); break; case State.GameOver: // タッチしたらシーンをリロード if (Input.GetButtonDown("Fire1")) Reload(); break; } } void Ready () { state = State.Ready; // 各オブジェクトを無効状態にする azarashi.SetSteerActive(false); blocks.SetActive(false); // ラベルを更新 scoreLabel.text = "Score : " + 0; stateLabel.gameObject.SetActive(true); stateLabel.text = "Ready"; } void GameStart () { state = State.Play; // 各オブジェクトを有効にする azarashi.SetSteerActive(true); blocks.SetActive(true); // 最初の入力だけゲームコントローラーから渡す azarashi.Flap(); // ラベルを更新 stateLabel.gameObject.SetActive(false); stateLabel.text = ""; } void GameOver () { state = State.GameOver; // シーン中のすべてのScrollObjectコンポーネントを探し出す ScrollObject[] scrollObjects = GameObject.FindObjectsOfType<ScrollObject>(); // 全ScrollObjectのスクロール処理を無効にする foreach (ScrollObject so in scrollObjects) so.enabled = false; // ラベルを更新 stateLabel.gameObject.SetActive(true); stateLabel.text = "GameOver"; } void Reload () { // 現在読み込んでいるシーンを再読込み Application.LoadLevel(Application.loadedLevel); } public void IncreaseScore () { score++; scoreLabel.text = "Score : " + score; } }
sakura_hana

2016/08/15 00:09

・Calc.csはシーン上の適当なオブジェクトに付けます。 (FieldInput1、FieldInput2に付ける必要はありません) ・TotalTextはどこで定義されているのでしょうか? スクリプトは大文字小文字を区別しますので、「TotalText」と「totalText」は別の変数になります。 ・string型は値渡しです。 最終的に表示する文字列は「Textコンポーネントのtext変数」に入れる必要があります。 string hoge = TotalText.text; //TotalText.textの『内容』をhogeに入れている hoge = “aaa”; //これだとTotalText.textの内容は書き変わらない(TotalText.text『そのもの』がhogeに入っているわけではない) TotalText.text = “bbb”; //これならTotalText.textが書き変わる 難しいと感じるのは、Unityのコンポーネント思考に慣れていない所為かと思います。 ・オブジェクトとコンポーネントのインスタンス化(『どこに存在しているか』のイメージ) ・型の定義と型変換 ・参照渡しと値渡し ・各コンポーネントにあるメソッドと変数(公式リファレンスを見る) この辺りが理解出来るとスムーズに進められると思いますので調べてみるとよいかと思います。
hogehoge0827

2016/08/15 10:19

>sakura_hanaさん 何度も丁寧なご回答をしていただき誠にありがとうございます。 しかしながら、まだ、解決の糸口が見えません。 以前、「GameObject名は適宜直す」とのコメントをいただいていたのですが、その直し方がわからず、さらにInputFieldは自動的に階層化されてしまうため、InputFieldに入力した数値が取れていないのではないかと推測しております。参考に、最初の質問の最下段に、Hierarchyのスクリーンショットを添付しました。 試しに、 textInput1 = GameObject.Find("FieldInput1_Text")...を textInput1 = GameObject.Find("Canvas/FieldInput1/FieldInput1_Text")...などとしてみましたがダメでした。 よりシンプルにするために、InputFieldを使わず、単純にTextコンポーネントa,b,cを出し、 予めaに1, bに2を入力しておき、 テキストをintに変換してから、 c=a+bを計算し、 cへテキストに変換して出力する などということも試みたのですが、うんともすんとも言わず、お手上げです。【Textコンポーネントに計算結果等、何かを出力する方法】が根本的に分からないようです。 本当にお手数おかけしてしまい申し訳ございませんが、何卒よろしくお願い申し上げます。 現状のスクリプトです。 using UnityEngine; using System; using UnityEngine.UI; public class Calc : MonoBehaviour { //public string totalOutput; //★合計金額のText用変数 public int Total = 0;//public int total = 0; //合計金額計算用変数の初期化 public Text TotalText; //InputFieldに入力されたものを受け取る。受け取る時の形式はInputField //★HierarchyのFieldInput1にCalc.csをAddComponentし、TotalTextにTotalOutputをドラッグ&ドロップする //★HierarchyのFieldInput2にCalc.csをAddComponentし、TotalTextにTotalOutputをドラッグ&ドロップする InputField textInput1; InputField textInput2; void Start() { //Textコンポーネントの取得は最初の一度だけでいいので、Start内で行う //GameObject名は適宜直す(◆直し方が分かりません。GameObject.Find("Canvas/FieldInput1/FieldInput1_Text")...などとやってみましたがダメでした) textInput1 = GameObject.Find("FieldInput1_Text").GetComponent<InputField>(); textInput2 = GameObject.Find("FieldInput2_Text").GetComponent<InputField>(); } //入力されたテキストを受け取ってコンソールにログを吐き出す public void ValueChange(string text) { //とりあえずtextInput1とtextInput2を並べて表示します //.textはstring型です。+で繋げると横に並べたように表示されます //例:textInput1の入力値が1、textInput2が2なら「1 2」と表示 //Debug.Log(textInput1.text + " " + textInput2.text); //Debug.Log(text);から変更(エラーになるので無効化しました) Debug.Log(text); } //合計値を算出 public void CalcTotal() { //テキストを数値に変換 int input1 = int.Parse(textInput1.text); int input2 = int.Parse(textInput2.text); //int型+int型=int型です、ValueChangeのデバッグログと見比べてみてください int Total = input1 + input2; Debug.Log(Total); //計算結果をとりあえずFieldInput1_Textに戻します //.textはstring型なので、int型をそのまま入れるとエラーを起こします //int型の変数の後ろに.ToString()を付けるとstring型に変換されます(←ここポイント) //.ToString()の代わりに「+ ""」でもstring型になります //textInput1.text = total.ToString(); //★計算結果をTextコンポーネントに出力するために変更 //合計金額を出力するTextコンポーネント「TotalOutput」にCalc.csをAddComponent //InspectorのTotalTextにHierarchyからTotalOutputをドラッグ&ドロップ TotalText.text = Total.ToString();//intのTotalをToStringでString化して、TotalTextに代入 } }
sakura_hana

2016/08/15 10:58

textInput1 = GameObject.Find("FieldInput1_Text").GetComponent<InputField>(); この行は「FieldInput1_Textというオブジェクトに付いているInputFieldコンポーネントを取得し、textInput1に入れる」という意味です。 FieldInput1_TextオブジェクトにはInputFieldが付いていないと思いますので、textInput1にはnullが入り、その後の処理でエラーを起こします。 InputFieldコンポーネントが付いているのは「FieldInput1」オブジェクトだと思いますので、 textInput1 = GameObject.Find("FieldInput1").GetComponent<InputField>(); とすればいいかと思います。"Canvas/FieldInput1"でもOKです。(textInput2も同様) ちなみに public int Total = 0; //メンバ変数 int Total = input1 + input2; //ローカル変数 こちら、エラーは起きないのですが、同名の変数が定義されています。 混乱の元なので、メンバ変数を削除するか、ローカル変数を別の名前にした方が良いでしょう。
hogehoge0827

2016/08/16 16:18

>sakura_hanaさん 何度もご回答有り難うございます。 InputFieldコンポーネントが付いているのは「FieldInput1」オブジェクトだと思いますので、 textInput1 = GameObject.Find("FieldInput1").GetComponent<InputField>(); とすればいいかと思います。 ↑これは自分だけでしたら、永久にハマり続けているところでした。本当に助かりました。 さて、目的を達成するために、今一歩進めてみました。 Unityで、下記をFieldInput1、FieldInput2対して行った所、入力した数字を拾えるようになりました。 HierarchyのFieldInput1にCalc.csをAddComponentし、 On Value Changedを+し、 FieldInput1をドラッグ&ドロップ1し、 プルダウンでCalc>ValueChangeを選択 On End Editも+し、 FieldInput1をドラッグ&ドロップ1し、 プルダウンでCalc>CalcTotal()を選択 すると、Debug.Log(Total);で、コンソールに合計値が出るようになりました。 しかしながら、下記のようなNullReferenceExceptionエラーが出てきてしまい、相変わらずTotalTextの内容が合計値に書き換わりません。 NullReferenceException: Object reference not set to an instance of an object Calc.CalcTotal () (at Assets/Scripts/Calc.cs:55) 55行目とは下記のコードです。 TotalText.text = Total.ToString(); おそらく、コードというよりは、Unity側のアタッチの問題だと思うのですが、何に何を取り付けたら良いのやら考え及ばず、何卒ご指導いただけたらと思います。よろしくお願い申し上げます。 現状のCalc.cs using UnityEngine; using System; using UnityEngine.UI; public class Calc : MonoBehaviour { //★合計金額表示用のText用変数 public Text TotalText; //InputFieldに入力されたものを受け取る。受け取る時の形式はInputField InputField textInput1; InputField textInput2; void Start() { //Textコンポーネントの取得は最初の一度だけでいいので、Start内で行う textInput1 = GameObject.Find("FieldInput1").GetComponent<InputField>();//「("FieldInput1_Text")」ではなく「("FieldInput1")」。FieldInput1_TextオブジェクトにはInputFieldが付いていない。「("Canvas/FieldInput1")」でもOK。 textInput2 = GameObject.Find("FieldInput2").GetComponent<InputField>(); } //入力されたテキストを受け取ってコンソールにログを吐き出す public void ValueChange(string text) { //★HierarchyのFieldInput1にCalc.csをAddComponentし、On Value Changedを+し、FieldInput1をドラッグ&ドロップ1し、プルダウンでCalc>ValueChangeを選択 //★On End Editも+し、FieldInput1をドラッグ&ドロップ1し、プルダウンでCalc>CalcTotal()を選択 //★HierarchyのFieldInput2にCalc.csをAddComponentし、On Value Changedを+し、FieldInput2をドラッグ&ドロップ1し、プルダウンでCalc>ValueChangeを選択 //★On End Editも+し、FieldInput2をドラッグ&ドロップ1し、プルダウンでCalc>CalcTotal()を選択 Debug.Log(textInput1); //textInput1を受け取れているか否かの確認 Debug.Log(textInput2); //textInput2を受け取れているか否かの確認 } //合計値を算出 public void CalcTotal() { //テキストを数値に変換 int input1 = int.Parse(textInput1.text); int input2 = int.Parse(textInput2.text); //int型+int型=int型です、ValueChangeのデバッグログと見比べてみてください int Total = input1 + input2; //Totalはローカル変数 Debug.Log(Total); //計算結果をとりあえずFieldInput1_Textに戻します //.textはstring型なので、int型をそのまま入れるとエラーを起こします //int型の変数の後ろに.ToString()を付けるとstring型に変換されます(←ここポイント) //.ToString()の代わりに「+ ""」でもstring型になります //textInput1.text = total.ToString(); //★計算結果をTextコンポーネントに出力するために変更 //合計金額を出力するTextコンポーネント「TotalOutput」にCalc.csをAddComponent //InspectorのTotalTextにHierarchyからTotalOutputをドラッグ&ドロップ TotalText.text = Total.ToString();//intのTotalをToStringでString化して、TotalTextに代入 } }
hogehoge0827

2016/08/17 16:08

TotalText.text = Total.ToString(); がNull Reference Exceptionになってしまう原因と解消法がわかりました! TotalTextに出力するにはvoid Start(){}内でGameObjectを宣言しておく必要がある。これがあれば、一番下の「TotalText.text = Total.ToString();」がNull Reference Exceptionにならない。 詳しくは「http://docs.unity3d.com/ja/current/Manual/ControllingGameObjectsComponents.html」を参照 void Start() { TotalText = GameObject.Find("TotalText").GetComponent< Text > (); //←この1行を追記! } これで動きます!!!! Calc.csの全コード using UnityEngine; using System; using UnityEngine.UI; public class Calc : MonoBehaviour { //★合計金額表示用のText用変数 public Text TotalText; //InputFieldに入力されたものを受け取る。受け取る時の形式はInputField InputField textInput1; InputField textInput2; void Start() { //Textコンポーネントの取得は最初の一度だけでいいので、Start内で行う textInput1 = GameObject.Find("FieldInput1").GetComponent<InputField>();//「("FieldInput1_Text")」ではなく「("FieldInput1")」。FieldInput1_TextオブジェクトにはInputFieldが付いていない。「("Canvas/FieldInput1")」でもOK。 textInput2 = GameObject.Find("FieldInput2").GetComponent<InputField>(); //★TotalTextに出力するにはvoid Start(){}内でGameObjectを宣言しておく必要がある。これがあれば、一番下の「TotalText.text = Total.ToString();」がNull Reference Exceptionにならない。 //★詳しくは「http://docs.unity3d.com/ja/current/Manual/ControllingGameObjectsComponents.html」を参照 TotalText = GameObject.Find("TotalText").GetComponent< Text > (); } //入力されたテキストを受け取ってコンソールにログを吐き出す public void ValueChange(string text) { //★HierarchyのFieldInput1にCalc.csをAddComponentし、On Value Changedを+し、FieldInput1をドラッグ&ドロップ1し、プルダウンでCalc>ValueChangeを選択 //★On End Editも+し、FieldInput1をドラッグ&ドロップ1し、プルダウンでCalc>CalcTotal()を選択 //★HierarchyのFieldInput2にCalc.csをAddComponentし、On Value Changedを+し、FieldInput2をドラッグ&ドロップ1し、プルダウンでCalc>ValueChangeを選択 //★On End Editも+し、FieldInput2をドラッグ&ドロップ1し、プルダウンでCalc>CalcTotal()を選択 Debug.Log(textInput1); //textInput1を受け取れているか否かの確認 Debug.Log(textInput2); //textInput2を受け取れているか否かの確認 } //合計値を算出 public void CalcTotal() { //テキストを数値に変換 int input1 = int.Parse(textInput1.text); int input2 = int.Parse(textInput2.text); //int型+int型=int型です、ValueChangeのデバッグログと見比べてみてください int Total = input1 + input2; //Totalはローカル変数 Debug.Log(Total); //計算結果をとりあえずFieldInput1_Textに戻します //.textはstring型なので、int型をそのまま入れるとエラーを起こします //int型の変数の後ろに.ToString()を付けるとstring型に変換されます(←ここポイント) //.ToString()の代わりに「+ ""」でもstring型になります //textInput1.text = total.ToString(); //★計算結果をTextコンポーネントに出力するために変更 //合計金額を出力するTextコンポーネント「TotalOutput」にCalc.csをAddComponent //InspectorのTotalTextにHierarchyからTotalOutputをドラッグ&ドロップ TotalText.text = Total.ToString();//intのTotalをToStringでString化して、TotalTextに代入 } } >sakura_hanaさん 懇切丁寧に、ご対応いただき誠にありがとうございました。本当に助かりました。 精進し、いつか困った人のお役に立てるようになりたいと思います。 引き続きよろしくお願い申し上げます。
sakura_hana

2016/08/18 14:25

解決出来て何よりです。 ちなみに最後に引っかかっていた部分ですが、 //InspectorのTotalTextにHierarchyからTotalOutputをドラッグ&ドロップ ↑これをやっていなかったからかと思います。 別のコンポーネントを取得する必要は大きく分けて2つあります。 ・public変数を使ってインスペクタからドラッグ&ドロップ ・GameObject.Find("hoge").GetComponent<hogehoge>() 「必要なオブジェクトは全て最初からシーン上に存在する、1回設定すれば後から変更されない」場合は前者を。 「必要なオブジェクトは後から生成される、何らかの理由で動的に取得する必要がある」場合は後者を使います。 基本的には前者を使った方がいいです(負荷が軽い。後者はGameObject名を変更した時にスクリプトも変更する必要があったり、オブジェクト名の打ち間違いが起こりやすいなど、エラーの原因になりやすい)。 ご参考までに。
hogehoge0827

2016/08/18 16:20

>sakura_hanaさん />/InspectorのTotalTextにHierarchyからTotalOutputをドラッグ&ドロップ >↑これをやっていなかったからかと思います。 ご指摘のとおりです。一度外して、そのままになっておりました。 >「必要なオブジェクトは全て最初からシーン上に存在する、1回設定すれば後から変更されない」場合は前者を。 >「必要なオブジェクトは後から生成される、何らかの理由で動的に取得する必要がある」場合は後者を使います。 なるほど、このような使い分けをするのですね。 将来的にはオブジェクトを動的に生成することも増えそうなので、両方覚えておきたいと思います。 この度は、本当に助かりました。誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問