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

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

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

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

Q&A

解決済

1回答

282閲覧

たくさん飛行機を前に進む処理でエラーが出る原因と対策方法がわからない

kudo201810

総合スコア30

Unity3D

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

0グッド

0クリップ

投稿2020/07/16 04:53

以下のスクリプトをつけた飛行機があり、

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ZERO3_fly_src : MonoBehaviour { public float speed = 10f; public float max_speed = 40f; Rigidbody rb; bool stop_f = false; void Awake() { rb = GetComponent<Rigidbody>(); } public void Execute() { //Update処理をここに記載 if (stop_f == false) { // キャラクターのローカル空間での方向 Vector3 forward = transform.transform.forward; if (rb.velocity.magnitude < max_speed) { // 前進 rb.AddForce(forward * speed, ForceMode.Acceleration); } } } }

飛行機はリジッドボディをつけておりプレハブ化して、Resourcesのフォルダに「ZERO3」という名前で保存してあります。
以下で飛行機をランダム生成しています。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ZERO3_Manaager : MonoBehaviour { private List<ZERO3_fly_src> enemys = new List<ZERO3_fly_src>(128); public int Max_obj = 40; public float Randm_s = 150f; public bool katamuki_f = true; public bool y_kotei_f = false; public bool y_kotei_katamuki_f = false; float R_x1; float R_y1; float R_z1; float y; void Awake() { for (int i = 0; i < Max_obj; i++) { var enemyObj = Resources.Load<GameObject>("ZERO3"); enemys.Add(enemyObj.GetComponent<ZERO3_fly_src>()); } for (int i = 0; i < Max_obj; i++) { R_z1 = 0f; float x = Random.Range(-Randm_s, Randm_s) + transform.position.x; if (y_kotei_f) { y = transform.position.y; } else { y = Random.Range(0.0f, Randm_s) + transform.position.y; } float z = Random.Range(-Randm_s, Randm_s) + transform.position.z; if (katamuki_f) { R_x1 = Random.Range(0, 360); R_y1 = Random.Range(0, 360); } else { R_x1 = 0f; R_y1 = 0f; } if (y_kotei_katamuki_f) { R_x1 = -90f; R_y1 = 0f; R_z1 = Random.Range(0, 360); } GameObject zero3 = Instantiate(enemys[i].gameObject, new Vector3(x, y, z), Quaternion.Euler(R_x1, R_y1, R_z1)) as GameObject; } } void Update() { for (int i = 0; i < enemys.Count; i++) { enemys[i].Execute(); } } }

するとゲームを実行すると、以下のエラーが大量に出るのですが

UnassignedReferenceException: The variable rb of ZERO3_fly_src has not been assigned.
You probably need to assign the rb variable of the ZERO3_fly_src script in the inspector.
UnityEngine.Rigidbody.get_velocity () <0x283108b8640 + 0x0006a> in <a1ce4ca84a944d8aa5e23aa6fa322f2e>:0
ZERO3_fly_src.Execute () (at Assets/ZERO3_fly_src.cs:23)
ZERO3_Manaager.Update () (at Assets/ZERO3_Manaager.cs:68)

対応の方法がわかりません。

Awakeで、rbにリジッドボディのコンポーネントを取得していると思うのですが
なぜか、取得できていません。その理由と対応策がわかりません。

無理やり、Execute()の中でリジッドボディを取得してもなぜか、
前進させたいのですが、エラーは消えるのですがなぜか前進しませんでした。

そもそも、Updateで記載していたときは問題なく前進していたのですが
処理を高速化したいと思って、上記のように書き換えたのですが

うまくいきませんでした。

お手数ですが回答お願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

以下で自己解決しました。リストに追加するタイミングが問題でした。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ZERO3_Manaager : MonoBehaviour { private List<ZERO3_fly_src> enemys = new List<ZERO3_fly_src>(128); public int Max_obj = 40; public float Randm_s = 150f; public bool katamuki_f = true; public bool y_kotei_f = false; public bool y_kotei_katamuki_f = false; float R_x1; float R_y1; float R_z1; float y; void Awake() { var enemyObj = Resources.Load<GameObject>("ZERO3"); for (int i = 0; i < Max_obj; i++) { R_z1 = 0f; float x = Random.Range(-Randm_s, Randm_s) + transform.position.x; if (y_kotei_f) { y = transform.position.y; } else { y = Random.Range(0.0f, Randm_s) + transform.position.y; } float z = Random.Range(-Randm_s, Randm_s) + transform.position.z; if (katamuki_f) { R_x1 = Random.Range(0, 360); R_y1 = Random.Range(0, 360); } else { R_x1 = 0f; R_y1 = 0f; } if (y_kotei_katamuki_f) { R_x1 = -90f; R_y1 = 0f; R_z1 = Random.Range(0, 360); } GameObject zero3 = Instantiate(enemyObj, new Vector3(x, y, z), Quaternion.Euler(R_x1, R_y1, R_z1)) as GameObject; enemys.Add(zero3.GetComponent<ZERO3_fly_src>()); } } void Update() { for (int i = 0; i < enemys.Count; i++) { enemys[i].Execute(); } } }

投稿2020/07/16 05:32

kudo201810

総合スコア30

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問