【Unity】ゲームの進行条件が複数あるとき

投稿者: | 2020-10-03

複数の条件をクリアしたときに次の状態に進むようにしてみます。上の動画では、青いCubeと赤いCubeの両方をクリックするとテキストが表示されて、3秒後にシーンがロードされます。

デリゲートでゲームの進行管理をするでは、デリゲートに常に1つのメソッドを入れていましたが、複数のメソッドをいれて、デリゲートが空になったら次に進むようにします。

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.IO;

public class GameScript : MonoBehaviour
{
    [SerializeField] Text text;
    float sec;
    Transform playerHead;

    delegate void Method(); // デリゲートを定義
    Method method;

    // Start is called before the first frame update
    void Start()
    {
        text.text = "";
        playerHead = Camera.main.transform;

        // 2つのメソッドを入れる
        method += Method1; 
        method += Method2;
    }

    // Update is called once per frame
    void Update()
    {

        method();

    }
 

    void Method1()
    {
        RaycastHit hit;

        // 青いCubeをクリックした時
        if(Input.GetMouseButtonDown(0) && Physics.Raycast(playerHead.position, playerHead.forward,out hit, 2f, ~(1 << 9)))
        {
            if (hit.collider.name == "Cube1")
            {
                method -= Method1; // メソッドを削除
                Destroy(hit.transform.gameObject);

                // デリゲートが空のとき
                if (method == null)
                {
                    text.text = "ゲーム終了";
                    method = Method3;
                }
            }
        }

    }

    void Method2()
    {
        RaycastHit hit;

        // 赤いCubeをクリックした時
        if (Input.GetMouseButtonDown(0) && Physics.Raycast(playerHead.position, playerHead.forward, out hit, 2f,~(1 << 9)))
        {
            if (hit.collider.name == "Cube2")
            {
                method -= Method2; // メソッドを削除
                Destroy(hit.transform.gameObject);

                // デリゲートが空のとき
                if (method == null)
                {
                    text.text = "ゲーム終了";
                    method = Method3;
                }
            }
        }

    }

    void Method3()
    {
        sec += Time.deltaTime;

        if (sec >= 3f)
        {
            sec = 0f;
            SceneManager.LoadScene("New Scene");
        }
    }
}

Start()で加算代入演算子(+=)を使って、デリゲートに2つのメソッドを入れています。

method += Method1;
method += Method2;

各メソッドでは、マウスクリックしたときに短いレイキャストを飛ばして、Cubeに当たれば、減算代入演算子を使って、デリゲートからメソッドを削除します。

その後デリゲートが空なら次のメソッドを入れてゲームを進行させます。空のときはnullになっています。

mmethod -= Method1; // メソッドを削除
Destroy(hit.transform.gameObject); // Cubeを削除

// デリゲートが空のとき
if (method == null)
{
    text.text = "ゲーム終了";
    method = Method3;
}

次の状態では、時間をカウントして、3秒後にシーンを再読み込みしています。

void Method3()
{
    sec += Time.deltaTime;

    if (sec >= 3f)
    {
        sec = 0f;
        SceneManager.LoadScene("New Scene");
    }
}

これで、複数の進行条件を簡単に管理できるようになりました。

コメントを残す

メールアドレスが公開されることはありません。