unityで作るクリア判定ゾーン

こんにちはR&R(RenRenCreate)です。今日はplayerやオブジェクトが到達したらクリアになる判定システムを作っていきます。

完成イメージ

今日はよくある教育用ゲームのドロップボックスをつくっていきます。様々なサイトや動画で紹介されているのでぜひ細かい部分は調べてみてください。

・赤いボックス(player)がゆっくり回転

・ボタンを押したら回転が止まって落下

・タイミングよくボタンを押すことでちょうど隙間の四角いスペースにplayerが入ってクリア

今回はコードとcompornentメインに紹介していきます。

オブジェクトの準備

完成イメージにあるようにオブジェクトを並べていきます。

ここで空のオブジェクトを一つ作成し、これに[boxcolider]をアタッチします。これをゲームクリアゾーンにします。

また、今回はこのplayerを操作するために落下開始ボタンとリトライボタンを作成します。

それぞれつぎのようになります。

ボタンに機能が付いていますが、これは次のコードで詳しく説明します。


コードの作成

クリアゾーンに入ったかどうかの判定はplayerの方で行っていきます。また、ボタンシステムで用いる関数も今回はここにまとめて書きました。次のコードをplayerにアタッチします。box coliderもアタッチしてください。

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

public class PlayerController : MonoBehaviour
{
    bool isStop;
    float startY;
    private void Start()
    {
        startY = transform.position.y;
    }
    private void Update()
    {
        if (isStop) return;

        //毎フレーム回転させる
        transform.Rotate(new Vector3(0, 0.5f, 0));//マイフレーム5度づつ回転

        //少しづつ下へ
        transform.Translate(0, -0.01f, 0);

        ///下まで行ったら上へ戻る。1は白い箱の位置
        if( 1 > transform.position.y)
        {
            Vector3 pos = transform.position;
            pos.y = startY;
            transform.position = pos;
        }
    }


//ここがクリア判定の関数。colliderが反応したときに呼び出される。
    private void OnCollisionEnter(Collision collision)
    {
        GameObject obj = collision.gameObject;

        if(obj.name.Equals("Clear"))//もしオブジェクトの名前がClearだったら。
            {
            //クリアしたときのコード。すきなようにカスタマイズ。
            }
    }

//ここはボタンにアタッチするようの関数2つ。リトライと、落下開始の機能。
    public void Stop()//これを落下開始ボタンへアタッチ。
    {
        isStop = true;

        GetComponent<Rigidbody>().isKinematic = false;
    }
    public void Retry()//リトライボタンへアタッチ。
    {
        SceneManager.LoadScene("Spotgame");
    }
}

これでplayerがうまく間を通り抜けてクリアゾーンに入ったら、クリア時のイベントを発生させることができるようになりました。今回はクリア時のイベントを作っていないので、各自Logなどに表示させたりして機能することを確認してみてください。


コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメント

タイトルとURLをコピーしました