複数の条件をクリアしたときに次の状態に進むようにしてみます。上の動画では、青い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");
}
}
これで、複数の進行条件を簡単に管理できるようになりました。