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

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

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

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

Unity

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

Q&A

解決済

1回答

1422閲覧

setActiveでfalseにしたGameObjectを取得してしまう原因について。

JonathanArma

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2021/05/18 08:59

編集2021/05/18 11:09

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
Unityで1対1の2Dシューティングゲームを作成しています。
発射した弾を敵(Bot)に当てることでHPを減らし、HPが0になったら、
GameObject(Bot)をSetActive(false)にし、Result画面に遷移するScriptを書いています。

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

敵に弾を当ててHPを0にした際に、下記のエラーコードがはかれました。
該当する行は
「var b_hp = botScript.p_hp;」
になります。

エラーメッセージ NullReferenceException: Object reference not set to an instance of an object Hud.Update ()

該当のソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7 8public class Hud : MonoBehaviour 9{ 10 11 public Image p_hpGauge; // Player HP ゲージ 12 public Image b_hpGauge; // Bot HP ゲージ 13 14 public static bool winLose = true; //勝敗判定 15 16 // ポーズした時に表示するUIのプレハブ 17 private GameObject pauseUIPrefab; 18 // ポーズUIのインスタンス 19 private GameObject pauseUIInstance; 20 21 // Start is called before the first frame update 22 void Start() 23 { 24 25 } 26 27 // Update is called once per frame 28 void Update() 29 { 30 // Botを取得する 31 var bot = GameObject.Find("Bot"); 32 Debug.Log(bot); 33 if (bot != null) 34 { 35 //BotについているScriptを取得する 36 var botScript = bot.GetComponent<BotController01>(); 37 38 // HP のゲージの表示を更新する 39 var b_hp = botScript.p_hp; 40 var b_hpMax = botScript.p_hpMax; 41 b_hpGauge.fillAmount = (float)b_hp / b_hpMax; 42 } 43 else 44 { 45 b_hpGauge.fillAmount = 0; 46 winLose = true; 47 SceneManager.LoadScene("Result"); 48 } 49 50 // プレイヤーを取得する 51 var player = GameObject.Find("Player1"); 52 Debug.Log(player); 53 54 if (player != null) 55 { 56 //Player1についているScriptを取得する 57 var playerScript = player.GetComponent<PlayerController>(); 58 59 Debug.Log(playerScript.p_hp); 60 // HP のゲージの表示を更新する 61 var p_hp = playerScript.p_hp; 62 var p_hpMax = playerScript.p_hpMax; 63 p_hpGauge.fillAmount = (float)p_hp / p_hpMax; 64 65 } 66 else 67 { 68 p_hpGauge.fillAmount = 0; 69 winLose = false; 70 SceneManager.LoadScene("Result"); 71 } 72 73 } 74 75}

試したこと

Player1にもHPを持たせ、Botと同じScriptで処理させたところ、問題なくResultのSceneに遷移しました。
Debug.LogもPlayerのほうはnull判定となっていましたが、botはnullではありませんでした。
Object(Bot)のInspectorを確認したところチェックボックスは空欄になっていたため、
setActiveは正常動作しているように見えます。

setActiveでfalseにしたGameObjectを取得してしまっている問題を解決したいと思います。

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

Unity2019.4.11f1 Personal

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

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

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

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

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

fiveHundred

2021/05/18 10:23

「疑問がある状況です」と書かれていても、「疑問があるから何?」と思われてしまうので、問題点や解決したい点を明確に記載したほうがいいです。 あと、質問とは全く関係ないですが、そもそも現状の敵の取得方法が、以下の理由からあまり良くないと思います。 - 敵が複数存在する場合、このままだと1体分しか取得できない - 敵が1体しか存在しない、という前提だとしても、その場合であればUpdate()で毎回敵を取得する必要性が感じられない(どうせ1つに決まっているのでStart()で取得したほうが良い)
JonathanArma

2021/05/18 11:49

ご指摘ありがとうございます。質問内容について修正いたしました。初めての質問で至らない点あり申し訳ありません。 また、敵の取得方法についてもご指摘ありがとうございます。 今後敵の数を追加する予定ですので、その際は上記検討し導入しようと思います。
guest

回答1

0

ベストアンサー

直接的な原因は分かりませんが、現状だと「Unityの仕様もしくはバグ」の可能性もあります。
Unityそのものを修正するわけにはいかないので、falseのオブジェクトが取得出来てしまうというケースがあるという前提でいたほうがいいかもしれません。
今回の場合、「activeInHierarchyで取得し、falseだったら処理を行わない」「(nullになっているのはbotScriptのほうなので)botScriptを取得できずにnullだった場合は処理を行わない」ということで回避できそうですが、どうでしょう。

投稿2021/05/18 11:33

fiveHundred

総合スコア9774

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

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

JonathanArma

2021/05/19 02:33

ご回答ありがとうございます。 頂いた2方法で検証してみました。 「activeInHierarchyで取得し、falseだったら処理を行わない」 こちらはBotオブジェクトが消えた後もTrueとなってしまいました。 「(nullになっているのはbotScriptのほうなので)botScriptを取得できずにnullだった場合は処理を行わない」 こちらの手法で実行し問題なく動作することを確認いたしました。 バグの可能性もありますが、まだ初心者であるため知らずにいじった設定やScriptがあったかもしれませんが、現状からの適切な回避方法をご提示いただき助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問