makeagame’s blog

UnityとVroidに関する情報を掲載しています。

Unity ブログ -Game Clearの定義-

このブログでわかること
・unityの基礎用語
・unityで躓きやすいカメラにいて
・unityで躓いたら見て欲しいところ
 
このブログはこんな方向け!
・Unity辞めたって人
・Unityやってみたいって人
・ゲーム作りに興味がある人
 
今回、私が作っているブロック崩しのゲームクリア条件についてのお話をしたいと思います。
 
ブロック崩しですから、ブロックが全部壊せたらゲームクリアになるわけですね。
 
でも、ブロックが全部壊れたとスクリプトに読み込ませるのはどうしたらいいのでしょうか?
 
結構ごり押しなのが「空のオブジェクトにすべてのブロックを読み込み、なくなったかなくなってないかを判断してもらう」みたいなことも可能です。
 
が、しかしかなり面倒くさくなりますし、おそらくメモリもめちゃくちゃ重くなってしまうと思うんですよね。
 
で、こういう時に役立つのが子オブジェクトの数を数える関数があるということです。
 
それが『childCount』なのです。
 
これは結構使い勝手もいいし、応用も利きそうな感じがするので知ってお得な関数だと思っております。
 

『childCount』の使い方

私はこのように使っております。

 

if(this.transform.childCount == 0)

{

   Destroy(gameObject);

}

 

こう書くことで「このオブジェクトの子オブジェクトの数が0になったら、このゲームオブジェクトを壊す」となります。

 

空のオブジェクトの中にブロックを入れておき、全部ブロックがなくなったら空のオブジェクトが壊れたり、0になったときにまた何かをするなどのフラグとしても有効です。

 

今回、ブロック内のスクリプト

 

void OnCollisionEnter(Collision collision)
{       
    Destroy(gameObject);
}

 
のように、何かが触れたら壊れるという風に書いております。
 
ブロック崩しですから、ボールが当たり、壊れていくわけですね。
 
で、下図のように空オブジェクトの中にブロックのオブジェクトを作ることでゲームクリア条件を作っているわけですね。

と、こういうような感じで空のオブジェクト内にブロックを敷き詰めていくことができます。
 
で、全部のブロックがなくなって空のオブジェクトのみになったら、読み込ませた「Game Clear」の文字を表示させたりなどができるわけですね。
 
ちょこっと例を出したいと思います。
 

using UnityEngine.UI;
using TMPro;

 

    Transform myTransform;
    public GameObject targetbutton;
    public GameObject TextMPgameover3;

    public GameObject targetball2;
    public GameObject player2;


    void Start()
    {
        myTransform = transform;
    }   

 

 void Update()
    {
        if (myTransform.childCount == 0)
        {
            TextMPgameover3.SetActive(true); //game clear
            targetbutton.SetActive(true); //reward

            targetball2.GetComponent<Rigidbody>().velocity = Vector3.zero;
            targetball2.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
            player2.GetComponent<Rigidbody>().velocity = Vector3.zero;
            player2.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
        }
    }

 

解説です!
Game Clearの文字を出したいので『public GameObject TextMPgameover3』で定義しております。
 
で、文字を出すにはUnityのUIを読み込む必要があるので、定義の前、一番最初に
 
『using UnityEngine.UI;』
『using TMPro;』
 
の2つを書いておく必要があります。
 
で、Start関数で初期化しておきます。
『myTransform.childCount == 0』で子オブジェクト(ブロック)が0になったら、各スクリプトが実施されるという流れですね。
 
if文の1行目はGame Clearの文字が出現すること
2行目はゲームクリア報酬で、画像が出現するボタンを表示させること
3行目以降はゲームクリアと同時に操作できる部分を止める必要があるため、ボールとプレイヤーの部分を止めていくスクリプトとなります。
 
これでゲームクリアの処理は完了です!
 
いかがでしたでしょうか?
ゲームクリア時に自機を止めるなど結構忘れがちになってバグにつながる恐れがあるのでその辺も注意していけるといいですね!
少しでも参考になれば幸いです。それでは!