🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity3D

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

Q&A

解決済

1回答

376閲覧

Update内でのFind

j.f15

総合スコア23

C#

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

Unity3D

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

0グッド

0クリップ

投稿2019/11/05 09:23

前提・実現したいこと

ランダムな敵を一定数出現させ、全部の敵を倒したらボスが出現するプログラムを作っています。
雑魚敵のタグを探してタグが無いとボスが出現するようになっています。
エラーは発生していないのですがオブジェクトのタグを取得するプログラムがupdate内でないと動きません。

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

エラーメッセージ

該当のソースコード

C#

1//ソースコードA 2public class EnemyJoji : MonoBehaviour { 3 4 public GameObject[] Train; //配列生成 5 private int number; 6 GameObject[] Enemy; 7 public GameObject BossEnemy; 8 9 int Count = 0; 10 int max = 5; 11 12 // Use this for initialization 13 void Start () { 14 InvokeRepeating("Generate", 1,1); //毎秒 15 16 Enemy = GameObject.FindGameObjectsWithTag("Enemy"); //ここだと動作しない 17 } 18 19 void Generate() 20 { 21 if (Count <= max) 22 { 23 number = Random.Range(0, Train.Length); //登録したプレハブからランダムな数字を取る 24 float x = Random.Range(-9f, 9f); //X軸のランダムな位置に設定 25 float y = 1; 26 float z = Random.Range(-9f, 9f); //Z軸のランダムな位置に設定 27 Vector3 position = new Vector3(x, y, z); 28 Instantiate(Train[number], position, Quaternion.identity); 29 Count++; 30 } 31 } 32 33 // Update is called once per frame 34 void Update () { 35 if (Enemy.Length <= 0) 36 { 37 Instantiate(BossEnemy, new Vector3(1.0f, 2.0f, 0.0f), Quaternion.identity); 38 } 39 } 40} 41 42 43//ソースコードB 44public class EnemyJoji : MonoBehaviour { 45 46 public GameObject[] Train; //配列生成 47 private int number; 48 GameObject[] Enemy; 49 public GameObject BossEnemy; 50 51 int Count = 0; 52 int max = 5; 53 54 // Use this for initialization 55 void Start () { 56 InvokeRepeating("Generate", 1,1); //毎秒 57 58 59 } 60 61 void Generate() 62 { 63 if (Count <= max) 64 { 65 number = Random.Range(0, Train.Length); //登録したプレハブからランダムな数字を取る 66 float x = Random.Range(-9f, 9f); //X軸のランダムな位置に設定 67 float y = 1; 68 float z = Random.Range(-9f, 9f); //Z軸のランダムな位置に設定 69 Vector3 position = new Vector3(x, y, z); 70 Instantiate(Train[number], position, Quaternion.identity); 71 Count++; 72 } 73 } 74 75 // Update is called once per frame 76 void Update () { 77 Enemy = GameObject.FindGameObjectsWithTag("Enemy"); //ここに移すと動作する 78 if (Enemy.Length <= 0) 79 { 80 Instantiate(BossEnemy, new Vector3(1.0f, 2.0f, 0.0f), Quaternion.identity); 81 } 82 } 83}

試したこと

ソースコードAでは全ての敵を倒してもボスは出現しません。
そこでFindをソースコードBのように変えるとボスが出現します。
ただ、どこのサイトでも言っているようにupdate内でFindを使うのは良くないとのことで
update外で無事に動作する方法を教えて欲しいです。
できればソースコードも見せて頂きたいです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

敵オブジェクトの生成時にEnemy配列に代入し、敵オブジェクトが破棄されるタイミングでEnemy配列から取り除けば希望通りの動作になるのでは無いでしょうか?(ただしGameObject[]の配列だと長さの動的変動が出来ないので、基本的にはListなどを使うことになりますが。)

ちなみにソースコードAで、Start関数内でFindを使用した後、Enemy配列の増減が行われるソースコードはありますか?無ければ一番初めにEnemy配列の中身を設定し、その後変化しないので
if (Enemy.Length <= 0)
がtrueにならないのは当たり前になりますが。。

投稿2019/11/05 10:48

yuuyu

総合スコア1139

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

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

j.f15

2019/11/05 15:29

なんとか出来ましたがListの使い方がまだまだだと実感しました。 これを機にListをもっと深くまで学ぼうと感じました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問