アトリエ殺人水上機

やりたいことをやった備忘録です。

Unityでストラックアウトを作る(4)クリア出来るようにする

sheeplane.hatenablog.com

この記事からの続きです。

今回はゲームとしてクリアできるようにしていきます。

目次

4、ゲームをクリアできるようにする

 4-1、各オブジェクトにタグを設定する

 4-2、的が撃ち抜かれたことを判定されるようにする

 4-3、的が全部撃ち抜かれたことを判定できるようにする

4、ゲームをクリアできるようにする

前回までの内容で一通りの動きは成り立ちましたが、ゲームが終わったことを告げてくれる機能がありません。

的を全部撃ち抜いたらゲームをクリアしたことにしていきます。

そのために、オブジェクトに付けることが出来るタグを有効活用していこうと思います。

4-1、各オブジェクトにタグを設定する

・判定用オブジェクトを追加しておく

今までの紹介ではピッチングマシン、ボール、枠、的以外のオブジェクトに触れていませんでしたが、的が枠から落ちた際に衝突してくれる地面を作っておきましょう。

地面用のオブジェクトはGameObject>3D Object>Planeを使っています。

そのままだと、地面に的が落ちた際的が重なると処理的にまずいことになりそうなので的が撃ち抜かれる先に壁も用意しておきます。

f:id:sheeplane:20180613162330p:plain

こんな感じです。

・タグを追加する

オブジェクトにタグを設定するにはオブジェクトを選択してInspectorを見ましょう。

オブジェクトの名前がついている下にTagと書かれたボタンがあると思います。これを押して、Add Tagを選択しましょう。

f:id:sheeplane:20180613162346p:plain

そうすると次のような画面が開きますので赤枠の"⁺"からタグを追加しましょう。

f:id:sheeplane:20180613162404p:plain

追加するタグは次の通りです。

 

①地面・壁など的を撃ち落とした後衝突するタグ(Ground)

②的に設定するタグ(Target)

③的が地面などに衝突した後変更されるタグ(D_Target)

 

上の図のようにタグが追加されていきますが、このままではオブジェクトにタグを設定できていません。オブジェクトにタグを設定するためにはもう一度オブジェクトを選択してTagを押す必要があります。

・オブジェクトにタグを設定する。

Tagを押すと設定できるタグが表示されるので、追加したタグを設定していきましょう。

 

①地面・壁など的を撃ち落とした後衝突するタグ(Ground)←地面・壁に設定

②的に設定するタグ(Target)←的のprefabに設定

③的が地面などに衝突した後変更されるタグ(D_Target)←今はなし

 

4-2的が撃ち抜かれたことを判定されるようにする

的が枠から落ちていることを判定するためには、地面や壁に的が当たったことを検出する必要があります。具体的には下記のサイト様を参考に次のようなスクリプトを書きました。

am1tanaka.hatenablog.com

    /** 衝突コールバック*/
    void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.CompareTag("Ground"))//もしこのスクリプトを付与したオブジェクトがタグGroundに衝突したら
        {
            gameObject.tag = "D_Target";//タグをD_Targetに変更する
        }
    }

このスクリプトを的に設定して、実際に撃ち落としてみると、上手くいっていれば撃ち落とした的のタグが変更されていると思います。

f:id:sheeplane:20180613162749p:plain

撃ち落とす前

f:id:sheeplane:20180613162801p:plain

撃ち落とした後

4-3、的が全部撃ち抜かれたことを判定できるようにする

上のスクリプトに、的が撃ち抜かれたことを判定できるようなスクリプトを追加していきます。ひよこ本p278~279

Unity2017入門 最新開発環境による簡単3D&2Dゲーム制作 (Entertainment&IDEA)

Unity2017入門 最新開発環境による簡単3D&2Dゲーム制作 (Entertainment&IDEA)

 

 に、シーン内のタグを検索する処理が記述されていますのでそれを流用したいと思います。

その結果、こんな感じのスクリプトになりました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class C_Target : MonoBehaviour {

    static int iBlockCnt;//iBlockCnt変数使用宣言
    public static bool clear;//clear変数使用宣言

    // Use this for initialization
    void Start () {
        iBlockCnt = GameObject.FindGameObjectsWithTag("Target").Length;//変数に初期ブロック数を投入
        clear = false;//変数に初期値falseを投入
    }

    /** 衝突コールバック*/
    void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.CompareTag("Ground"))//もしこのスクリプトを付与したオブジェクトがタグGroundに衝突したら
        {
            gameObject.tag = "D_Target";//タグをD_Targetに変更する
            if (GameObject.FindWithTag("Target") == null) {//もしタグTargetが存在しなかったら
                clear = true;//変数をtrueにする
                Debug.Log("OK!");//デバッグ画面で動作確認
            }
        }
    }

} 

 

スクリプトだけでは正常に処理ができているかわからないので、デバッグ画面で正常に動作しているか確認することにしました。

Debug.Log("OK!");//デバッグ画面で動作確認

この記述で正常に動作しているかを確認したいと思います。

正常に動作していたら、こんな感じでコンソール画面にDebug.Logで指定したコメントが表示されます。

f:id:sheeplane:20180613162142p:plain

 

今回は以上です。次回はこのクリア判定を使用してタイム・スコアの実装をしたいと思います。

よろしくお願いします。