【Unity(C#)】一気にゲームオブジェクトを消す方法


  
  
  
この記事は

『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』

の記事です。そのつもりでお読みください。
  

一気にゲームオブジェクトを消す

①消したいゲームオブジェクトにTagを付ける
FindGameObjectsWithTag(タグ名)でTagのついたオブジェクトを配列にぶちこむ
foreachで一気に消す!

できれば、消したいゲームオブジェクトはプレハブにしといた方が楽です。
プレハブなら大量にゲームオブジェクトを配置したとしてもTagを一気に変更できます。
(大量に配置している時点でプレハブは利用済みかと思いますが念のため...)


void AllDEstroy()
    {
        GameObject[] balls = GameObject.FindGameObjectsWithTag("Ball");

        foreach (GameObject ball_Soccer in balls)
        {
            Destroy(ball_Soccer);
        }
    }

foreachは繰り返しです。
配列ballsの中身をball_Soccerに何度も繰り返し入れています。

繰り返しで一気に消えるというのが初心者の私にはイメージしづらかったので
本当に繰り返しているのか確認してみました。

int count = 0;

    void Start()
    {
        AllDEstroy();
    }

    void AllDEstroy()
    {
        GameObject[] balls = GameObject.FindGameObjectsWithTag("Ball");

        foreach (GameObject ball_Soccer in balls)
        {
            Destroy(ball_Soccer);
            count++;  //ボールがDestroyされるたびにcountを1追加
            print(count);
        }
    }

  
  
ちゃんと繰り返していました。

これはつまり、厳密にいうと同時ではないのでしょうか?
えらいひと教えてください。


2019/06/19 追記

子のオブジェクトをまとめて取得

よく使うのでメモしときます。

取得したい子オブジェクトが存在する親オブジェクトにアタッチ
        foreach(Transform childrenTransform in this.gameObject.transform)
        {
            //一例として子のイメージコンポーネントを取得して色を変える
            image = childrenTransform.GetComponent<Image>();
            image.color = Color.yellow;
        }

上記のやり方をUpdat内で呼ぶと、何回もforeachのループを回して取得しに行くので
returnで抜ける処理も合わせるといいかも。

    Image image;

    void Update () {
        LightSelectedImage();
    }

    //選んだイメージを光らせる
    void LightSelectedImage()
    {
        //一度foreachを通ったらimageにはコンポーネントが入っている
        if (image != null)
        {
            return;
        }

        foreach(Transform childrenTransform in this.gameObject.transform)
        {

            image = childrenTransform.GetComponent<Image>();
            image.color = Color.yellow;
        }
    }

追記 2019/07/15

マテリアルの一括取得

マテリアルの場合の一括取得は また別の方法になるのでメモしときます。

マテリアルを取得したいオブジェクトにアタッチ
    Material[] mr;

    void Start()
    {
        mr = this.gameObject.GetComponent<MeshRenderer>().materials;
    }

    public void GetMaterials()
    {
        for(int i = 0; i < mr.Length; i++)
        {
            // 例)Shaderの疑似bool値をオンに
            mr[i].SetFloat("_Enabled", 1);
        }

    }

materialsで一括取得できるので、配列に突っ込めばforやforeachで取り出せます。

余談ですがMaterialの設定にたまにあるトグル(下記画像参照)は
Shaderでbool値をPropertyに追加することはできないため、
0 or 1の疑似表現(0ならFalse、1ならTrueみたいな)によって実装するみたいです。