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

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

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

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

Unity

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

Q&A

解決済

1回答

1083閲覧

GetComponent Find が実行されていない

ichigo_0308

総合スコア41

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/08/13 07:33

編集2020/08/14 02:28

<実現したいこと>

Gameobject.Findで取得したTextに文字を入れたい。

<画像>

イメージ説明
textはちゃんと4つある。

<エラーコード>

NullReferenceExpition:Object refenrence not set to an instance of an object GameScript.update()(at Asset/GAmeScript.cs:61)

<ソースコード>

C#

1 2using System; 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6using UnityEngine.UI; 7using UnityEngine.SceneManagement; 8 9 10public class GameScript : MonoBehaviour 11{ 12 // ロングタップ判定で使用する変数 13 float longTapTime = 2.0f; // 実行直後は、longTapTimeを過ぎると、ロングタップとみなされる 14 // 1回目の問題が終わると、タップする目標時間 15 float nowTapTime; // タップし始めてから現在までの時間 16 float safeTime = 1.0f; // 目標時間に対して許容される誤差 17 bool isLongtap; // ロングタップ中かどうか(タップする時間がlongTapTimeを越えるとtrueになる) 18 bool isLongtapclear; // ロングタップが終わったか 19 20 // ゲームで使用する変数 21 int challengecount; // 挑戦回数 22 static int clearcount; // クリアした回数 23 int level; // 難易度 24 bool startflag = false; // ゲーム開始されていたらtrue。開始前(カウントダウン中も含む)ならfalse; 25 public string count; // 秒読みで表示する値 26 27 // デバッグ用表示テキスト 28 private Text countText; // カウントダウン表示 29 private Text Text1; // longTapTime表示(ロングタップとみなされる時間) 30 private Text Text2; // safeTime表示(タップ時間の許容誤差) 31 private Text Text3; // clearCount表示(クリアした回数) 32 private Text Text4; // nowTapTime(現在のタップ時間) 33 public string Text1s; // longTapTime 34 public string Text2s; // safeTime 35 public string Text3s; // clearCount 36 37 public RectTransform clearcountR; 38 // Start is called before the first frame update 39 void Start() 40 { 41 42 // 表示するTextのセット 43 countText = GameObject.Find("CountText").GetComponent<Text>(); 44 Text1 = GameObject.Find("LongTapTime").GetComponent<Text>(); 45 Text2 = GameObject.Find("SafeTimeText").GetComponent<Text>(); 46 Text3 = GameObject.Find("clearCount").GetComponent<Text>(); 47 Text4 = GameObject.Find("NowTapTime").GetComponent<Text>(); 48 level = PlayerPrefs.GetInt("level"); 49 kabe(); // レベルに合わせて許容誤差を計算 50 count3(); // カウントダウン開始 51 52 // Textの初期値 53 Text1s = longTapTime.ToString(); 54 Text2s = safeTime.ToString(); 55 Text3s = clearcount.ToString(); 56 } 57 58 // Update is called once per frame 59 void Update() 60 { 61 Text1.text = Text1s; 62 Text2.text = Text2s; 63 Text3.text = "clearcount: " + Text3s; 64 if (startflag) 65 { 66 // ゲームが開始されていたら.... 67 Text1.text = Text1s; // タップ目標時間を表示 68 Text2.text = Text2s; // 許容時間を表示 69 Text3.text = "clearcount: " + Text3s; 70 if (Input.GetMouseButton(0)) 71 { 72 // ボタンが押されていたら... 73 isLongtapclear = false; // ロングタップが終わっていない状態にして 74 Text1.text = Text1s; 75 Text2.text = Text2s; 76 Text3.text = "clearcount: " + Text3s; 77 nowTapTime += Time.deltaTime; // 秒数をカウント 78 Text4.text = nowTapTime.ToString(); 79 80 // タップし続けた時間が規定値を超えたらロングタップとして扱う 81 if (nowTapTime >= longTapTime && !isLongtap) 82 { 83 challengecount += 1; 84 ///////////////////////////////// 85 //「ロングタップであることがわかってから、タイマーをスタートさせる」ようになっていたけれど 86 // これが原因で、タイマーがリセット(nowTapTimeが 0にもどる)されてしまうので、 87 // 以下の1行を削除 88 //nowTapTime = 0; 89 // ロングタップの時間計測を、Update()内で行うように変更したので、 90 // 以下の1行を削除。 91 //StartCoroutine( "MyLoop" ); // タイマーリセット 92 ///////////////////////////////// 93 isLongtap = true; // ロングタップしたフラグを立てる 94 Debug.Log("Long Tap"); 95 } 96 97 } 98 else if (Input.GetMouseButtonUp(0)) 99 { 100 101 print((longTapTime - safeTime < nowTapTime) + " : " + (longTapTime + safeTime > nowTapTime) + " : " + !isLongtapclear); 102 if ((longTapTime - safeTime < nowTapTime) 103 && (longTapTime + safeTime > nowTapTime) && !isLongtapclear) 104 { 105 isLongtapclear = true; 106 Debug.Log("tapclear!"); 107 longTapTime = UnityEngine.Random.Range(2, 6); 108 Text1.text = Text1s; 109 clearcount += 1; 110 Text3.text = "clearcount: " + Text3s; 111 Text1s = longTapTime.ToString(); 112 Text2s = safeTime.ToString(); 113 Text3s = clearcount.ToString(); 114 } 115 else 116 { 117 Debug.Log("OUT"); 118 } 119 120 121 // クリックを終えたら初期化 122 nowTapTime = 0; 123 isLongtap = false; 124 } 125 126 } 127 } 128 public void kabe() 129 { 130 safeTime = 1.0f / (level + 1.0f); 131 safeTime *= 3.0f; 132 Debug.Log(safeTime); 133 } 134 public void count3() 135 { 136 count = "3"; 137 countText.text = count; 138 Invoke("count2", 1); 139 } 140 public void count2() 141 { 142 count = "2"; 143 countText.text = count; 144 Invoke("count1", 1); 145 } 146 public void count1() 147 { 148 count = "1"; 149 countText.text = count; 150 Invoke("start", 1); 151 } 152 public void start() 153 { 154 count = "start!"; 155 countText.text = count; 156 Invoke("startsetting", 1); 157 } 158 public void startsetting() 159 { 160 startflag = true; 161 162 } 163 164}

Text1.text = Text1s; Text2.text = Text2s; Text3.text = "clearcount: " + Text3s;
ここでエラーが起きているようです。
ここに関係するのは
countText = GameObject.Find("CountText").GetComponent<Text>(); Text1 = GameObject.Find("LongTapTime").GetComponent<Text>(); Text2 = GameObject.Find("SafeTimeText").GetComponent<Text>(); Text3 = GameObject.Find("clearCount").GetComponent<Text>(); Text4 = GameObject.Find("NowTapTime").GetComponent<Text>();
です。Text1,2,3はGameobject.FindでUnity上にあるTextを取得しています。
ですが、エラーが起きてしまいます。
###<試したこと>
Text1.text = Text1s;
Text2.text = Text2s;
Text3.text = "clearcount: " + Text3s;
自体をコメント化してみましたが、今度はそのあと実行されることが実行されなくなってしまいました。
###<環境>
ver Unity 2018.4.12f1 Personal

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

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

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

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

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

tsuki01

2020/08/13 13:49 編集

Text1〜4に該当する、GameObjectが写っているUnityのスクリーンショット(Hierarchyウィンドウのスクショ)を、質問に貼り付けて頂けたら回答がつきやすくなるかもしれませんが、いかがでしょうか。 ※本当に対象のGameObjectが存在しているのか確認できるため。 また念の為確認ですが、以下の"clearCount"だけ頭小文字になっているの正しいでしょうか。 他のものは頭大文字になっているのに、こちらだけ頭小文字になっているので、タイプミスの可能性が気になりました(正しいオブジェクト名だったら失礼しました) 「GameObject.Find("clearCount").GetComponent<Text>();」
ichigo_0308

2020/08/14 02:23

> Text1〜4に該当する、GameObjectが写っているUnityのスクリーンショット(Hierarchyウィンドウのスクショ)を、質問に貼り付けて頂けたら回答がつきやすくなるかもしれませんが、いかがでしょうか。 okです。 >また念の為確認ですが、以下の"clearCount"だけ頭小文字になっているの正しいでしょうか。  他のものは頭大文字になっているのに、こちらだけ頭小文字になっているので、タイプミスの可能性が 気になりました(正しいオブジェクト名だったら失礼しました)  「GameObject.Find("clearCount").GetComponent<Text>();」 正しいオブジェクト名ですね。
yuuyu

2020/08/14 02:48

CountText、LongTapTimeなどのtextは全てtextコンポーネントを持っていますか?TextMeshProを使用していたり、空のgameobjectを設定していないか等一度確認していただけますか?
ichigo_0308

2020/08/14 05:37 編集

@yuuyuu 空のgameobjectを設定していませんでした????
yuuyu

2020/08/14 10:03

>空のgameobjectを設定していませんでした 「空のgameobject」を設定するのではなく、上記オブジェクトがtextではなく「TextMeshPro」だったり、「空のgameobject」を間違って設定していないか、というのを確認していただきたいという意図でした。説明不足で申し訳ありません。
ichigo_0308

2020/08/15 02:50

スミマセン!誤字ってました! 誤> 空のgameobjectを設定していませんでした 正> 空のgameobjectwを設定していました texhMeshProではないですね。
yuuyu

2020/08/15 08:24

ではtextコンポーネントが含まれるオブジェクトに変更したらどうなりますか? あと回答者が居ますので、下記内容で動いたのか、もしくは動いていないなら動いていない旨を記載してあげてください。
tsuki01

2020/09/13 02:54

1ヶ月近く質問が放置されているため、以下の対応をお願いできませんでしょうか。 ・自己解決したならその旨回答を追加し、自己解決済みに更新する ・こちらが回答した内容で解決したなら、解決済みに更新する
guest

回答1

0

ベストアンサー

スクショの追加ありがとうございます。
スクショのGameObjectとコード比較しましたが、以下GameObject名の指定が誤ってないでしょうか。

C#

1// ※GameObject側とコード側で、スペルの大文字小文字が異なっている("t"が違っている) 2// ※GameObject側では"Text"がついているのに、コード側では抜けている 3誤: Text1 = GameObject.Find("LongTapTime").GetComponent<Text>(); 4正: Text1 = GameObject.Find("LongtapTimeText").GetComponent<Text>(); 5 6// ※"Count"の大文字小文字がGameObjectと異なっている 7誤: Text3 = GameObject.Find("clearCount").GetComponent<Text>(); 8正: Text3 = GameObject.Find("clearcount").GetComponent<Text>();

補足
他の方からのコメントにもありますが、各GameObjectに"Text"コンポーネントがアタッチされているかもご確認ください。

投稿2020/08/14 02:49

編集2020/08/14 02:52
tsuki01

総合スコア1751

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問