unity 开发日记之Action事件管理器
Action
unity 内置action 事件系统,可以很方便添加调用各种方法,但是在开发中如果不加以管理,会使我们的代码很乱。
定义类 EntrustCtrl
该类不继承于MonoBehaviour,通过私有 Dictionary存储事件 共有方法调用,绑定,触发 上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class EntrustCtrl
{
public enum EventType
{
ET_UpLeftHand,//左边玩家举手
ET_UpRightHand,//右边玩家举手
ET_LeftReady,//左边玩家准备
ET_RightReady,//右边玩家准备
ET_LeftHeadRaw,//左边玩家头像
ET_RightHeadRaw,//右边玩家头像
ET_HpLeft,//左边玩家血量
ET_HpRight,//右边玩家血量
ET_GameReady,//游戏准备
ET_GameTime,//游戏时间
ET_Explain,//说明面板
ET_Setting,//设置面板
ET_LeftComplete,//左边是否完成面板
ET_RightComplete,//右边是否完成面板
ET_LeftVictory,//左边是否胜利面板
ET_RightVictory,//右边是否胜利面板
ET_LeftRawActive,//左边头像显示
ET_RightRawActive,//右边头像显示
}
Dictionary<EventType, Action<object[]>> EventVessel = new Dictionary<EventType, Action<object[]>>();//创建容器
//事件绑定
public void AddVessel(EventType _type,Action<object[]> _fun)
{
if (EventVessel.ContainsKey(_type))//判定字典里是否有该项
{
EventVessel[_type] += _fun;//绑定指定事件
return;
}
EventVessel[_type] = _fun;
}
//解除绑定
public void PopVessel(EventType _type,Action<object[]> _fun)
{
if (EventVessel.ContainsKey(_type))
{
EventVessel[_type] -= _fun;
}
}
//事件触发
public void TriggerEvent(EventType _type, object[] objs)
{
if (EventVessel.ContainsKey(_type))
{
EventVessel[_type](objs);//触发
}
}
#region 单列
EntrustCtrl() { }
public static readonly EntrustCtrl Instance = new EntrustCtrl();
#endregion
}
类型枚举 EventType
用于管理事件类型,可以看到我已经添加了多种类型,根据不同的类型,我们可以添加 调用 销毁不同的事件
使用方法
定义方法,进入场景绑定事件 ,退出场景销毁事件
/// <summary>
/// 内容面板事件 0内容 1打开或者关闭
/// </summary>
/// <param name="obj"></param>
public void ExplainEvent(object[] obj)
{
bool isopen = (bool)obj[1];
if (isopen)
{
hp_bg.SetActive(isopen);
hp_explain.gameObject.SetActive(isopen);
string content = (string)obj[0];
//hp_content.text = content;
hp_explain.transform.DOScale(1, 1f).SetEase(Ease.InOutElastic);
AudioManager.Instanct.Play("yes1", Vector3.zero,false);
}
else
{
hp_explain.transform.DOScale(0, 0.5f).OnComplete(delegate {
hp_explain.gameObject.SetActive(isopen);
hp_bg.SetActive(isopen);
});
}
}
//绑定
private void OnEnable()
{
EntrustCtrl.Instance.AddVessel(EntrustCtrl.EventType.ET_Explain, ExplainEvent);
}
//解除
private void OnDisable()
{
EntrustCtrl.Instance.PopVessel(EntrustCtrl.EventType.ET_Explain, ExplainEvent);
}
在适合的地方就可以调用触发事件方法
参数 object[] 需要定义的时候就确定好数组长度和类型,定义和调用时类型需要相同,不然会报错
//none状态
public void None()
{
//调用游戏说明ui事件
string content = "游戏过程中,需要躲避危险物的袭击,<color=red>摆动自己身体姿势</color>躲避危险物的袭击,游戏中有补给物,同样可以<color=red>摆动身体姿势</color>,吃补给物加血!";
object[] obj = new object[] { content,true };
EntrustCtrl.Instance.TriggerEvent(EntrustCtrl.EventType.ET_Explain, obj);
gedm_stateTimer.Set(5);
gm_gameState = GameState.GS_GoReady;
}