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

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

ただいまの
回答率

90.53%

  • Unity

    3966questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Box2D

    4questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 301

uepon

score 10

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)
該当行で、

    {
            for (int i = 0; i < HUMAN_num; i++)
            {
            Human_Status human_status = Chara[i];

            Vector3 pos = human_status.Human.transform.position;//151行目
            human_status.T_Counter = human_status.T_Counter + 1;


コード


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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


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

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

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


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

  • 動作未確認なので、バグやエラーがあるかもしれません
  • 意図を伝えることを優先したため、よいソースコードではないと思いますので、適宜変更してください
public class Desert_load5 : MonoBehaviour
{
    public List<Human_Status> Chara = new List<Human_Status>();

    void Start()
    {
        // プレハブからオブジェクトを生成
        GameObject obj = Instantiate(~) as GameObject;

        // オブジェクトからTrigger3を取得
        Trigger3 trigger = obj.GetComponent<Trigger3>();

        // Trigger3に、Desert_load5のインスタンスを設定
        trigger.DesertLoad5Object = this;

        // オブジェクトからHuman_Statusを取得
        Human_Status human_status = obj.GetComponent<Human_Status>();

        // Charaリストに要素を追加
        Chara.Add(human_status);
    }
}
public class Trigger3 : MonoBehaviour
{
    public Desert_load5 DesertLoad5Object;
    public GameObject M_obj;

    void OnTriggerEnter2D(Collider2D c)
    {
        if (c.gameObject.tag == "Hit")
        {
            // CharaリストにあるM_objのHuman_Statusを削除
            Human_Status human_status = M_obj.GetComponent<Human_Status>();
            DesertLoad5Object.Chara.Remove(human_status);

            GameObject.Destroy(M_obj);
            M_obj = null;
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/06 16:52

    お忙しい所、低レベルな質問に対して、アドバイスして頂きありがとうございます。
    public int HUMAN_num = 7;
    public List<Human_Status> Chara = new List<Human_Status>();

    Chara.Add(human_status);
    とList配列を作ったのですが、
    配列Charaから破棄するオブジェクトを外してあげる方法が解りません。
    アドバイスの程、よろしくお願いいたします。

    キャンセル

  • 2018/05/06 17:41

    「Chara.Remove(~);」でよいと思います。

    この場合、Listの長さは可変になるので、HUMAN_numではなく「Chara.Count」を使ってください。

    キャンセル

  • 2018/05/06 18: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で宣言すると他のソースでも参照出来ると思っているのですが、間違いですか?
    本当に初歩的な質問で申し訳ありません。

    キャンセル

  • 2018/05/06 18:29

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

    キャンセル

  • 2018/05/06 18: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で宣言すると他のソースでも参照出来ると思っているのですが、間違いですか?
    本当に初歩的な質問で申し訳ありません。

    キャンセル

  • 2018/05/06 18:48

    Human_Statusは型なので、引数に指定することは当然できません。
    Human_Statusはどういうクラスかは分かりませんが、敵キャラクターにアタッチしているなど、何かしらで敵キャラクター用に用意しているはずですので、そのHuman_Statusを取得し、それをChara.Remove()で削除してください。

    > publicで宣言すると他のソースでも参照出来ると思っているのですが、間違いですか?

    この考え自体は合っています。単に間違った指定をしているだけです。

    キャンセル

  • 2018/05/06 18: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に赤の波線が付きます。
    度々申し訳ないのですが、ご教授の程、よろしくお願いいたします。

    キャンセル

  • 2018/05/06 18:54

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

    キャンセル

  • 2018/05/06 19: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で宣言すると他のソースでも参照出来ると思っているのですが、間違いですか?

    >この考え自体は合っています。単に間違った指定をしているだけです。
    ここをもう少し詳しく教えていただけないでしょうか。
    よろしくお願いいたします。

    キャンセル

  • 2018/05/06 19:17

    Charaとかhuman_statusとか書いても、どのクラス(あるいはインスタンス)のものか指定しないとエラーになります。


    > ここをもう少し詳しく教えていただけないでしょうか。

    「publicで宣言すると他のソースでも参照出来る」のは正解ですが、コード自体が間違っているという意味です。

    キャンセル

  • 2018/05/06 20: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)
    と、エラーが出ます。

    本当にすみませんがもう少し、ご教授の程、よろしくお願いいたします。

    キャンセル

  • 2018/05/06 21:24

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

    とりあえず、ソースコードを質問文に追記しておきます。

    キャンセル

  • 2018/05/08 03:55

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/06 13:33

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

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Unity

    3966questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Box2D

    4questions

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