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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

2回答

1257閲覧

数字のついたオブジェクトを指定して、Activeにしたい。

biginerofunity

総合スコア8

C#

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

0グッド

0クリップ

投稿2020/03/10 21:22

編集2020/03/10 21:25

前提・実現したいこと

5×5のマスに色のついた箱を、各色の個数は一定で、場所をランダムにして出現させたいです。
そのために各色の箱を25個ずつ用意してあり、Red4などのように名前を振ってあります。

発生している問題・エラーメッセージ

以下のようなエラーが出てしまいます。52行目はコードに示してあります。

NullReferenceException: Object reference not set to an instance of an object Color.Start () (at Assets/Cscript/Color.cs:52)

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Color : MonoBehaviour { public GameObject Red; public GameObject Black; public GameObject Blue; public GameObject Gray; int start = 0; int end = 24; int count = 24; List<int> numbers = new List<int>(); void Start() { for (int i = start; i <= end; i++)///リストに挙げる { numbers.Add(i); } float k;float j;int l=0; for (k = 0;k< 5; k++){ for (j = 0; j < 5; j++) { Instantiate(Red, new Vector3(k, j, 0f), Quaternion.identity).name="Red"+l; GameObject.Find("Red" + l).SetActive(false); Instantiate(Black, new Vector3(k, j, 0f), Quaternion.identity).name = "Black" + l; GameObject.Find("Black" + l).SetActive(false); Instantiate(Blue, new Vector3(k, j, 0f), Quaternion.identity).name = "Blue" + l; GameObject.Find("Blue" + l).SetActive(false); Instantiate(Gray, new Vector3(k, j, 0f), Quaternion.identity).name = "Gray" + l; GameObject.Find("Gray" + l).SetActive(false); l++; } } while (count-- > 0) { Debug.Log("count"+count); int index = Random.Range(0, numbers.Count); int ransu = numbers[index]; if (count< 7) { Debug.Log(ransu); GameObject.Find("Red" + ransu).SetActive(true); }else if (count<15) { Debug.Log(ransu); GameObject.Find("Blue" + ransu).SetActive(true); }else if (count == 15) { Debug.Log(ransu); GameObject.Find("Black" + ransu).SetActive(true); } else { Debug.Log(ransu); GameObject.Find("Gray" + ransu).SetActive(true); <=====ここにエラーが出ています } numbers.RemoveAt(index); } } // Update is called once per frame void Update() { } }

試したこと

ゲームオブジェクトを探し出せていないということなので、ransuの部分を文字型にしたり、整数型にするなどしましたがエラーが出でしまいました。プレハブから生成した直後のfalseにする操作はうまくいっています。

また、エラー行の1行上にDebug.Log("Gray" + ransu)と入力するとUnityEngine.Debug:Log(Object)と帰ってきます。

どなたかご教授よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

回答とは違うのですが、気になる点があったので差し出がましいですがアドバイスします。

Startの中のfor文のループ数のためにわざわざfloat k;という風に宣言していますが、後々に使い回すことがなくfor文だけで使う一時的な変数であれば、これはfor(float k = 0; k < 5; k++)という風に書けばfor文内だけで使用する一時変数として宣言できますよ。

あとループカウンタ(このスクリプトでいうfloat kとfloat j)にfloatを用いるのはよくありません、理由としてはfloatは浮動小数点変数なので、ループがただしく終わらなかったり、結果にズレが発生したりする恐れがあります。
なので、ループカウンタには整数であるintを使うことを推奨します。

投稿2020/03/11 01:56

Y0241-N

総合スコア1066

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

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

0

Findを使う方法はおすすめできません
基本的にはInstantiateの返り値を保存しておいて使うのがいいと思います

var g = Instantiate(Red, new Vector3(k, j, 0f), Quaternion.identity); g.name = "red" + l; g.SetActive(false); // List<(適当なクラス)> field; みたいな感じで25個作っておく field[k * 5 + j].red = g;

投稿2020/03/10 21:48

izmktr

総合スコア2856

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問