使用C#事件,在遊戲中對場景的Collider觸發做出反應

c#事件和Unity觸發器

今天在跟着視頻做遊戲的時侯,遇到一個問題:
當玩家在場景移動的過程中會觸發場景的觸發器,觸發時遊戲中要進行一些操作,如播放對應的聲音,燈光改變。視頻中是把遊戲管理類做成了單例,然後調用裏面的方法。我覺這種方式有點不好,具體那裏不好也說不上來,我就想可以用C#中的事件來做這個事情。

  1. 首先建立一個事件的發佈器類,用於事件的發佈還有定義
  2. 把這個定義爲單例
  3. 在觸發器腳本代碼中調用事件的發佈方法
  4. 在遊戲控制類中註冊事件。

以下是代碼

事件的發佈器用於事件的發佈

using UnityEngine;

//事件的發佈器
/// <summary>
/// 自定義時間處理
/// 1,時間的監聽和分發
/// </summary>
public class CustomEventManager
{
	public delegate void DiscoveredHandler(Vector3 pos);
	public event DiscoveredHandler DiscoveredEvent;

	private static CustomEventManager _instance;
	static CustomEventManager() {
		_instance = new CustomEventManager();
	}

	public static CustomEventManager Instance{
		get{return _instance;}
	}

	public void OnEvent(Vector3 pos) {
		if (DiscoveredEvent != null) {
			DiscoveredEvent(pos);
		}
	}
}

事件的註冊

public bool OnAlerm = false;

	private Vector3 _lastPlayerPos = Vector3.zero;
	private GameObject[] _sirens = new GameObject[6];

	private void Awake()
	{
		_sirens = GameObject.FindGameObjectsWithTag(Tags.siren);
		// 使用事件機制來進行玩家觸發觸發器事件的監聽
		CustomEventManager.Instance.DiscoveredEvent += new CustomEventManager.DiscoveredHandler(DiscoverPlayer);
	}
	private void DiscoverPlayer(Vector3 pos) {
		OnAlerm = true;
		_lastPlayerPos = pos;
	}

事件的觸發

***1,第一個腳本中的代碼***  
private void OnTriggerStay(Collider other)
	{
		CustomEventManager.Instance.OnEvent(other.transform.position);
	}
***第二腳本中的代碼***
public class MyCctvCamera : MonoBehaviour {
	//public delegate void DiscoveredHandler(Vector3 pos);
	//public event DiscoveredHandler DiscoveredEvent; 
	public void OnTriggerStay(Collider other)
	{
		if (other.tag == Tags.player) {
			//DiscoveredEvent(other.transform.position);
			CustomEventManager.Instance.OnEvent(other.transform.position);
		}
	}
}

一點拙見,不知道這樣會不會好一點,以後理解的更深入了再來修改,有好的方法可以用,繼續努力

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章