c#事件和Unity触发器
c#事件和Unity触发器
今天在跟着视频做游戏的时侯,遇到一个问题:
当玩家在场景移动的过程中会触发场景的触发器,触发时游戏中要进行一些操作,如播放对应的声音,灯光改变。视频中是把游戏管理类做成了单例,然后调用里面的方法。我觉这种方式有点不好,具体那里不好也说不上来,我就想可以用C#中的事件来做这个事情。
- 首先建立一个事件的发布器类,用于事件的发布还有定义
- 把这个定义为单例
- 在触发器脚本代码中调用事件的发布方法
- 在游戏控制类中注册事件。
以下是代码
事件的发布器用于事件的发布
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);
}
}
}
一点拙见,不知道这样会不会好一点,以后理解的更深入了再来修改,有好的方法可以用,继续努力