为了降低耦合,要减少不同类以及父子节点之间的相互引用。如此一来,对象之间的交互就会常常用到事件。
事件的原理,是一个对象在状态改变时发出信号,如某个按钮被点击,另一个对象接到这个信号做出相应反映。所以事件或者委托,也可以看做是消息发出者和接收者之间的一个中间人,两方都只需要和这个中间人接触即可,这样就降低了耦合。
在unity中由于事件类的代码重复性很高,所以用一个泛型类作为父类,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace framework
{
public class Event<T> where T: Event<T>
{
private static Action EventTrigger;
public static void Register(Action onEvent)
{
EventTrigger += onEvent;
}
public static void unRegister(Action onEvent)
{
EventTrigger -= onEvent;
}
public static void Trigger()
{
EventTrigger?.Invoke();
}
}
}
完成这个父类后,每当新建一个事件类时只要继承它就可以了:
public class xxEvent:Event<xxEvent>
{
}
在需要发出事件信号的地方写一个班级,比如开始游戏的按钮:
public class StartPanel : MonoBehaviour
{
public GameObject enemies;
void Start()
{
transform.Find("startBtn").GetComponent<Button>().onClick.AddListener(() =>
{
...
StartEvent.Trigger();
});
}
}
然后再需要做出相应的地方注册响应事件的函数(在结束时解除注册)
public class game : MonoBehaviour
{
void Start()
{
StartEvent.Register(GenerateEnemy);
}
private void GenerateEnemy()
{
transform.Find("enemies").gameObject.SetActive(true);
}
private void OnDestroy()
{
StartEvent.unRegister(GenerateEnemy);
}
}
|