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

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

詳細はこちら
Box2D

Box2Dは、C++で記述された2D物理演算エンジン。C++以外にも多くの言語に移植されています。円形・多角形の物体の運動をシミュレーションすることが可能で、GUIで動作を確認できるテストベッドが付属されています。

Unity

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

Q&A

解決済

2回答

2806閲覧

複数の敵キャラの中で自機から弾が出て当たると敵キャラが消えるソースを作りたい。

uepon

総合スコア17

Box2D

Box2Dは、C++で記述された2D物理演算エンジン。C++以外にも多くの言語に移植されています。円形・多角形の物体の運動をシミュレーションすることが可能で、GUIで動作を確認できるテストベッドが付属されています。

Unity

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

0グッド

0クリップ

投稿2018/05/05 09:38

編集2018/05/05 16:45

Unity 初心者です。
複数の敵キャラの中で自機から弾が出て当たると敵キャラが消えるソースを作りたい。
Unity にて、prefabにBox Collider 2D設定し下記ソースを、敵キャラクターPrefabに設定したのですが、

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Trigger3 : MonoBehaviour { public GameObject M_obj; // Use this for initialization void Start () {   }   // Update is called once per frame   void Update () {      } void OnTriggerEnter2D(Collider2D c) { if (c.gameObject.tag == "Hit") { GameObject.Destroy(M_obj); M_obj = null; } if (M_obj == null) { Debug.Log("hoge hoge"); } if (M_obj != null) { Debug.Log("homo homo"); } Debug.Log("hit3 Object COLLISION"); Debug.Log("M_obj " + M_obj); return; } } コード

エラーコードから、
MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
Desert_load5.Update () (at Assets/Desert_load5.cs:151)
該当行で、

void

1 { 2 for (int i = 0; i < HUMAN_num; i++) 3 { 4 Human_Status human_status = Chara[i]; 5 6 Vector3 pos = human_status.Human.transform.position;//151行目 7 human_status.T_Counter = human_status.T_Counter + 1; 8 9 10コード

プレファブをnullにした後、どのように振るまっていいのか解りません。
アドバイスの程、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

配列Charaに破棄されたオブジェクトが入っているからだと思われます。
Destroyする前に、配列Charaから破棄するオブジェクトを外してあげる必要があります。


質問とは関係ないですが、

プレファブをnullにした後、

この場合、「プレハブから生成したオブジェクト」と言ったほうが正しいです。
プレハブはシーン上に生成するオブジェクトの元となるものを指すので、そこから生成したものはプレハブとは言わないです。


追記:
私が伝えたかった内容としては、以下のソースコードのような感じです。
ただ、注意点があり、以下の通りになります。

  • 動作未確認なので、バグやエラーがあるかもしれません
  • 意図を伝えることを優先したため、よいソースコードではないと思いますので、適宜変更してください

C#

1public class Desert_load5 : MonoBehaviour 2{ 3 public List<Human_Status> Chara = new List<Human_Status>(); 4 5 void Start() 6 { 7 // プレハブからオブジェクトを生成 8 GameObject obj = Instantiate() as GameObject; 9 10 // オブジェクトからTrigger3を取得 11 Trigger3 trigger = obj.GetComponent<Trigger3>(); 12 13 // Trigger3に、Desert_load5のインスタンスを設定 14 trigger.DesertLoad5Object = this; 15 16 // オブジェクトからHuman_Statusを取得 17 Human_Status human_status = obj.GetComponent<Human_Status>(); 18 19 // Charaリストに要素を追加 20 Chara.Add(human_status); 21 } 22}

C#

1public class Trigger3 : MonoBehaviour 2{ 3 public Desert_load5 DesertLoad5Object; 4 public GameObject M_obj; 5 6 void OnTriggerEnter2D(Collider2D c) 7 { 8 if (c.gameObject.tag == "Hit") 9 { 10 // CharaリストにあるM_objのHuman_Statusを削除 11 Human_Status human_status = M_obj.GetComponent<Human_Status>(); 12 DesertLoad5Object.Chara.Remove(human_status); 13 14 GameObject.Destroy(M_obj); 15 M_obj = null; 16 } 17 } 18}

投稿2018/05/06 04:53

編集2018/05/06 12:25
fiveHundred

総合スコア10152

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

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

uepon

2018/05/06 07:52

お忙しい所、低レベルな質問に対して、アドバイスして頂きありがとうございます。 public int HUMAN_num = 7; public List<Human_Status> Chara = new List<Human_Status>(); … Chara.Add(human_status); とList配列を作ったのですが、 配列Charaから破棄するオブジェクトを外してあげる方法が解りません。 アドバイスの程、よろしくお願いいたします。
fiveHundred

2018/05/06 08:41

「Chara.Remove(~);」でよいと思います。 この場合、Listの長さは可変になるので、HUMAN_numではなく「Chara.Count」を使ってください。
uepon

2018/05/06 09:05

度々、申し訳ありません。 今、Trigger3.csに   Chara.Remove(Chara.count); Destroy(M_obj); のソースを入れたのですが、 Desert_load5.csに下記のようにpublicでCharaを設定しているのですが、 public List<Human_Status> Chara = new List<Human_Status>(); Charaに赤い波線が付きます。 publicで宣言すると他のソースでも参照出来ると思っているのですが、間違いですか? 本当に初歩的な質問で申し訳ありません。
fiveHundred

2018/05/06 09:29

Chara.Remove()の引数には、敵キャラクターのプレハブのHuman_Statusを指定してください。 「Chara.Count」は「HUMAN_num」の代わりに使えという意味ですので、Chara.Remove()に指定するものではないです。
uepon

2018/05/06 09:40

今、CharaとHuman_Statusに赤い波線が付きます。 Chara.Remove(Human_Status); Destroy(M_obj); 上記は、Trigger3.cに設定してます。 度々、申し訳ないのですが、 Desert_load5.csに下記のようにpublicでCharaを設定しているのですが、 public List<Human_Status> Chara = new List<Human_Status>(); Chara、Human_Statusに赤い波線が付きます。 publicで宣言すると他のソースでも参照出来ると思っているのですが、間違いですか? 本当に初歩的な質問で申し訳ありません。
fiveHundred

2018/05/06 09:48

Human_Statusは型なので、引数に指定することは当然できません。 Human_Statusはどういうクラスかは分かりませんが、敵キャラクターにアタッチしているなど、何かしらで敵キャラクター用に用意しているはずですので、そのHuman_Statusを取得し、それをChara.Remove()で削除してください。 > publicで宣言すると他のソースでも参照出来ると思っているのですが、間違いですか? この考え自体は合っています。単に間違った指定をしているだけです。
uepon

2018/05/06 09:50

public int HUMAN_num = 7;の代わりに、 public List<Human_Status> Chara = new List<Human_Status>(); public Human_Status human_status = new Human_Status(); Chara.count = 7; を設定したのですが、Chara.countに赤の波線が付きます。 度々申し訳ないのですが、ご教授の程、よろしくお願いいたします。
fiveHundred

2018/05/06 09:54

「Chara.Count」はCharaリストの要素の数を取得するものなので、自分で設定する必要はありませんし、出来ません。 また、CountのCは大文字です。
uepon

2018/05/06 10:05

Desert_load5.csにて Vector2 tmp2 = GameObject.Find("Mexico_Man").transform.position; GameObject.Find("Mexico_Man").transform.position = new Vector2(UnityEngine.Random.Range(-1.0f, 2.3f), UnityEngine.Random.Range(1.8f, 4.6f)); Mexico_Man_obj = Instantiate(Resources.Load("Mexicoman_pref"), new Vector2(tmp2.x, tmp2.y), Quaternion.identity) as GameObject; human_status.Human = Mexico_Man_obj; Chara.Add(human_status); で。LIST配列にしているのですが、 Trigger3.cの Chara.Remove(human_status.Human);の Charaとhuman_statusに赤い波線が付きます。 >> publicで宣言すると他のソースでも参照出来ると思っているのですが、間違いですか? >この考え自体は合っています。単に間違った指定をしているだけです。 ここをもう少し詳しく教えていただけないでしょうか。 よろしくお願いいたします。
fiveHundred

2018/05/06 10:17

Charaとかhuman_statusとか書いても、どのクラス(あるいはインスタンス)のものか指定しないとエラーになります。 > ここをもう少し詳しく教えていただけないでしょうか。 「publicで宣言すると他のソースでも参照出来る」のは正解ですが、コード自体が間違っているという意味です。
uepon

2018/05/06 11:17

>Charaとかhuman_statusとか書いても、どのクラス(あるいはインスタンス)のものか指定しないと>エラーになります。 下記URLを見て、 http://www.cho-design-lab.com/2013/08/18/unity-reference-other-script/ Desert_load5 Chara = GetComponent<Desert_load5>() ; Desert_load5 human_status = GetComponent<Desert_load5>(); Chara.Remove(human_status);//28行目 で合ってますか? Visual Stdioでは、エラーが消えたのですが、Unityでデバッグすると、 NullReferenceException: Object reference not set to an instance of an object Trigger3.OnTriggerEnter2D (UnityEngine.Collider2D c) (at Assets/Trigger3.cs:28) と、エラーが出ます。 本当にすみませんがもう少し、ご教授の程、よろしくお願いいたします。
fiveHundred

2018/05/06 12:24

これではCharaやhuman_statusの意味自体が変わってしまうので、設計を変えたなら別ですが、そうでなければ論外です。 正直、あなた自身のソースコードを理解しているかすら疑問に思えてしまいます。 意味を理解せず、手当たり次第に直しても、状況が悪化するだけです。 とりあえず、ソースコードを質問文に追記しておきます。
uepon

2018/05/07 18:55

色々とアドバイスして頂きありがとうございます。 ソース大変ためになりました。 己が基礎が出来てないのに、難しいオリジナルゲームをいきなり作ろうとしたので、 fiveHundred様にご負担をおかけして申し訳ありませんでした。 もっと簡単な、ブロック崩しゲームから、やり直したいと考えています。 重ね重ね色々とありがとうございましました。
guest

0

質問の内容がよく分かりません。
エラーを消したいのは理解しましたがゲーム?の内容、どうしたらそうなったのか、2つのソースコードの関連性など???です。
再度質問内容を整理して頂いた方が皆さん答えやすいと思います。

投稿2018/05/05 20:25

hitomi0714

総合スコア14

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

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

fiveHundred

2018/05/06 04:33

失礼しますが、このような「内容が分からないので追記や整理をしてほしい」ということは「質問への追記・修正の依頼」に書き込んだほうがよろしいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問