unity 开发日记之Action事件管理器

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;
    }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值