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

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

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

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

Unity

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

Q&A

解決済

1回答

2294閲覧

敵が死んだ時の処理(オブジェクトの消滅・消滅音・消滅エフェクトを)を一括しているスクリプト

nissei

総合スコア35

C#

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

Unity

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

0グッド

1クリップ

投稿2017/09/24 06:08

タイトル通り、オブジェクトの消滅・消滅音・消滅エフェクトを一括している命令文をまとめているマネージャー的な空のオブジェクトの関数に設定し、対象のEnemyオブジェクトが死んだ(倒した)時にこの命令文を引っ張てきて使用したいのですが上手くいきません。

EnemyA

if (EnemyA_Hp == 0) { Enemy_Generator Hp = gameObject.GetComponent<Enemy_Generator>(); Hp.Enemy_HP(); }

Enemy_Generator

public void Enemy_HP() { Destroy(gameObject); Instantiate(explosion, transform.position, Quaternion.identity); audio.PlayOneShot(clip); }

Enemy_Generator側のスクリプトには音とエフェクトの変数は設定済み。
各コード上にエラーの赤波線は出ておらず、プレイを開始するとコンソール画面にて、

NullReferenceException: Object reference not set to an instance of an object
Choki_red.Update () (at Assets/GameScene/_Script/_Enemy/Choki_red.cs:39)

NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていない

と出てしまいます。

どの部分をどの様に書き換えればいいのか教えて頂いたいです!
宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーが出ている箇所(Choki_red.csの39行目)がどうなっているのか分からないので、直感です。

質問内容から推測すると、EnemyAをアタッチしているゲームオブジェクトとEnemy_Generatorをアタッチしているゲームオブジェクトは異なっていると思います。
そうであれば、以下の3箇所が正しくありません。

C#

1 Enemy_Generator Hp = gameObject.GetComponent<Enemy_Generator>();

上記では、同じゲームオブジェクト内にアタッチされているEnemy_Generatorを取得します。
前述の通りであれば、Enemy_Generatorは違うゲームオブジェクトにアタッチされているため、取得することが出来ません(この場合、nullになります)。

C#

1 Destroy(gameObject);

上記では、EnemyAではなくEnemy_Generatorのゲームオブジェクトが削除されてしまいます。

C#

1 Instantiate(explosion, transform.position, Quaternion.identity);

同様に、EnemyAではなくEnemy_Generatorの位置に生成されてしまいます。

この3点を修正すると、以下のようになります。

EnemyA

C#

1 if (EnemyA_Hp == 0) 2 { 3 // FindObjectOfType()で、シーン全体からEnemy_Generatorを探して取得します 4 // (この関数は動作が重いため、可能であればStart()で使ってください) 5 Enemy_Generator Hp = FindObjectOfType<Enemy_Generator>(); 6 7 // EnemyAのゲームオブジェクトを引数で渡します 8 Hp.Enemy_HP(gameObject); 9 }

Enemy_Generator

C#

1 public void Enemy_HP(GameObject enemyGameObject) 2 { 3 // 引数で渡されたEnemyAの位置に生成 4 // (Destroy()後だと、正しく実行されるか分からないので、順番を変えてます) 5 Instantiate(explosion, enemyGameObject.transform.position, Quaternion.identity); 6 7 // (修正していないですが、3Dサウンドを考慮して、EnemyAの位置に生成した方がよいと思います) 8 audio.PlayOneShot(clip); 9 10 // 引数で渡されたEnemyAのゲームオブジェクトを削除 11 Destroy(enemyGameObject); 12 }

投稿2017/09/24 07:23

編集2017/09/24 07:37
fiveHundred

総合スコア9774

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

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

nissei

2017/09/25 05:17

ありがとうございます!引数と返却値についてまだまだ勉強不足なのが実感できました。 教えてくれた点を基盤にアレコレと試した結果上手くいきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問