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

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

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

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1145閲覧

playerがやられたら敵さんに少し待ってもらってその続きからまた再開したい。Unity

Um_kok

総合スコア39

C#

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/09/26 02:14

編集2020/09/26 03:39

タイトルの通りですが。player が 敵の弾に当たってやられます。
そのあとに、敵さんに待ってもらいたいのですが。player を取得できていません
調べてみたところ
コルーチンを使いました。

今回やりたいこと
/ エラーを直したい
やった事

スクリプトリファレンスなどや、いろいろなサイトも見させていただいたのですが。エラーが取れないです。print()などでみたところ、やられたらnull になり、Instantiate で出てきた瞬間エラーが起きます

敵の配列を動かしているスクリプト(一部抜粋)

c#

1 2 public GameObject[] inv = new GameObject[55] ; // 敵の配列 3 [System.NonSerialized] 4 public int cnt = 0; // 配列番号 5 6void Update(){ 7 if(/*playerPos == null &&*/ DeadPlayer) 8 { 9 print(playerPos); 10 11 12 StartCoroutine("RedChenger"); 13 14 // return; return したら3秒後にInstantiateで出てきた瞬間エラー 15 } 16 print(inv[cnt].transform.position); 17 18 print(playerPos); 19 20 // 敵の範囲内にいるとき かつ startBullet が true のとき 21 if (inv[cnt].transform.position.x > playerPos.transform.position.x -0.5f && inv[cnt].transform.position.x < playerPos.transform.position.x + 0.5f && startBullet) 22 { 23 // 敵の弾を生成 24 Instantiate(inveaderBulletPrefab, new Vector3(inv[cnt].transform.position.x, inv[cnt].transform.position.y - 0.7f, 0f), Quaternion.identity); 25 26 // 敵の弾のカウントを増やす 27 inveaderBulletNumber++; 28 29 // startBullet フラグを false 30 startBullet = false; 31 32 } 33 } 34 35IEnumerator RedChenger() 36 { 37 // 全体回す 38 for (int i = 0; i < inv.Length; i++) 39 { 40 // 赤色にする 41 inv[i].GetComponent<Renderer>().material.color = Color.red; 42 //print(i); 43 } 44 // 3秒松 45 yield return new WaitForSeconds(3); 46 47 48 // 元の色に戻す 49 ColorChanger(); 50 51 var player = Instantiate(playerPre, new Vector3(-3, -4, 0), Quaternion.identity); 52 53 //playerPos = player; 54 55 playerPos = GameObject.Find("player"); 56 57 DeadPlayer = false; 58 59 yield break; 60 }

エラーの箇所

c#

1 // 敵の範囲内にいるとき かつ startBullet が true のとき 2 if (inv[cnt].transform.position.x > playerPos.transform.position.x -0.5f && inv[cnt].transform.position.x < playerPos.transform.position.x + 0.5f && startBullet)

エラー内容は言った通りですが。行は上のです。 print(playerPos); が null です。inv[cnt]は入っています
NullReferenceException: Object reference not set to an instance of an object
moveDirecter.Update () (at Assets/Scrips/moveDirecter.cs:169)

初心者ながらゲーム制作をしています。もし回答してくださるならばとてもうれしいです。
こんな自分にご教授いただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーが起きている部分というのはplayerが生きているときの処理ですよね。
if( playerPos != null)で囲えばエラーは起きないんじゃないですか。

投稿2020/09/26 04:26

i_zna

総合スコア198

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

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

Um_kok

2020/09/26 05:05

回答ありがとうございます。言い方が悪かったかもしれません、 プレイヤーがやられる→プレイヤーが消される→if( DeadPlayer)に入る→StartCoroutine("RedChenger");でコルーチンを呼ぶ→Instantiate でプレイヤーを生成し、そいつの参照がされない!ということです。 Instantiate で出したプレイヤーの参照の仕方を聞いています。すみません
i_zna

2020/09/26 05:40

ええと、コルーチンの仕組みは理解していますか。StartCoroutineはコルーチンを開始するという指示をするだけで、コルーチン内の処理が終了するまでUpdate()の中身が停止するわけではないです。 playerPosの中身はRedChengerが取得する3秒間nullですが、その間Update()は全文毎フレーム実行されています。(コルーチンも180回ほど実行されることになります。)
i_zna

2020/09/26 05:50

で、どうすればいいのかというと、Update()内ではやはり上記のような方法でplayerPosがnullのときに判定を回避し、DeadPlayerはStartCoroutineした直後にfalseにしてしまうのが良いかと思います。
Um_kok

2020/09/26 06:09

失礼しました。初心者で申し訳ないです。コルーチンはUpdate も回るんですね。一つ勉強になりました。ありがとうございます。 上記の方法でやってみたのですが、エラーは取れました!ですが、Instantiateで生成されたプレイヤーが参照されてません。なので敵の配列がこっちを狙って撃ってきません. 考えられる理由としては何でしょうか?
Um_kok

2020/09/26 06:11

Instantiate で生成後、Print(playerPos)でみるとnull と出ます。
i_zna

2020/09/26 06:30

先程こちらで実験したところ、ちゃんと参照を取得できたので原因はコード外だと思われます。 Instantiate自体でエラーが出ないとすると、①prefabの名前が「player」になっていない ②生成直後に消滅している の2つしか思いつきません。
i_zna

2020/09/26 06:35

あ、③playerPosの参照が他所で変更されている も確認してください。
Um_kok

2020/09/26 06:47

調べてみたところ、①はInstantiateでplayer(clone)になってますが、たぶん大丈夫です。②は生成後に動かせるので大丈夫です。③は参照は2つあり一つはこのスクリプト内のUpdate で Findされていて、もう一つはコルーチンの中です。困りましたね。
i_zna

2020/09/26 07:11

すみません、見落としていました。GameObject.Findは名前の完全一致で探すものなので(clone)がついていると拾いません。Instantiateは参照を返してくれるので playerPos = Instantiate(playerPre, new Vector3(-3, -4, 0), Quaternion.identity); とすれば大丈夫です。
Um_kok

2020/09/26 07:30

そうだったんですか、知らなかったです。playerPos = Instantiate(playerPre, new Vector3(-3, -4, 0), Quaternion.identity);としてみました。しかし、nullで参照されなかったので、Update()で回しているもう一つの、FindをStart()に移しplayerを取得してみたところ、player(Clone)が返ってきました。上書きしてしまっていて、nullだったのですね。自分の知識不足というのを痛感しました。こんな私に教えてくださってありがとうございました。プログラム頑張ります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問