【Unity基础】Unity的事件系统 ------ Player的等级变化引起一系列的变化

工具类:能避免重复挂载事件 用来代替默认的事件

using System;

namespace Utils
{
    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeAction
    {
        Action act;

        public static implicit operator Action(SafeAction a)
        {
            return a.act;
        }

        public static implicit operator SafeAction(Action a)
        {
            SafeAction res = new SafeAction();
            res.act = a;
            return res;
        }
        public static SafeAction operator +(SafeAction a, Action b)
        {
            a.act -= b;
            SafeAction res = new SafeAction();
            res.act = a.act + b;

            return res;
        }

        public static SafeAction operator -(SafeAction a, Action b)
        {
            SafeAction res = new SafeAction();
            res.act = a.act - b;
            return res;
        }

        public void SafeInvoke()
        {
            act.SafeInvoke();
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeAction<T>
    {
        Action<T> act;

        public static implicit operator Action<T>(SafeAction<T> a)
        {
            return a.act;
        }

        public static implicit operator SafeAction<T>(Action<T> a)
        {
            SafeAction<T> res = new SafeAction<T>();
            res.act = a;
            return res;
        }
        public static SafeAction<T> operator +(SafeAction<T> a, Action<T> b)
        {
            a.act -= b;
            SafeAction<T> res = new SafeAction<T>();
            res.act = a.act + b;

            return res;
        }

        public static SafeAction<T> operator -(SafeAction<T> a, Action<T> b)
        {
            SafeAction<T> res = new SafeAction<T>();
            res.act = a.act - b;
            return res;
        }

        public void SafeInvoke(T param)
        {
            act.SafeInvoke(param);
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeAction<T, T2>
    {
        Action<T, T2> act;

        public static implicit operator Action<T, T2>(SafeAction<T, T2> a)
        {
            return a.act;
        }

        public static implicit operator SafeAction<T, T2>(Action<T, T2> a)
        {
            SafeAction<T, T2> res = new SafeAction<T, T2>();
            res.act = a;
            return res;
        }

        public static SafeAction<T, T2> operator +(SafeAction<T, T2> a, Action<T, T2> b)
        {
            a.act -= b;
            SafeAction<T, T2> res = new SafeAction<T, T2>();
            res.act = a.act + b;

            return res;
        }

        public static SafeAction<T, T2> operator -(SafeAction<T, T2> a, Action<T, T2> b)
        {
            SafeAction<T, T2> res = new SafeAction<T, T2>();
            res.act = a.act - b;
            return res;
        }

        public void SafeInvoke(T param, T2 param2)
        {
            act.SafeInvoke(param, param2);
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeAction<T, T2, T3>
    {
        Action<T, T2, T3> act;

        public static implicit operator Action<T, T2, T3>(SafeAction<T, T2, T3> a)
        {
            return a.act;
        }

        public static implicit operator SafeAction<T, T2, T3>(Action<T, T2, T3> a)
        {
            SafeAction<T, T2, T3> res = new SafeAction<T, T2, T3>();
            res.act = a;
            return res;
        }
        public static SafeAction<T, T2, T3> operator +(SafeAction<T, T2, T3> a, Action<T, T2, T3> b)
        {
            a.act -= b;
            SafeAction<T, T2, T3> res = new SafeAction<T, T2, T3>();
            res.act = a.act + b;

            return res;
        }

        public static SafeAction<T, T2, T3> operator -(SafeAction<T, T2, T3> a, Action<T, T2, T3> b)
        {
            SafeAction<T, T2, T3> res = new SafeAction<T, T2, T3>();
            res.act = a.act - b;
            return res;
        }

        public void SafeInvoke(T param, T2 param2, T3 param3)
        {
            act.SafeInvoke(param, param2, param3);
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeAction<T, T2, T3, T4>
    {
        Action<T, T2, T3, T4> act;

        public static implicit operator Action<T, T2, T3, T4>(SafeAction<T, T2, T3, T4> a)
        {
            return a.act;
        }
        
        public static implicit operator SafeAction<T, T2, T3, T4>(Action<T, T2, T3, T4> a)
        {
            SafeAction<T, T2, T3, T4> res = new SafeAction<T, T2, T3, T4>();
            res.act = a;
            return res;
        }
        
        public static SafeAction<T, T2, T3, T4> operator +(SafeAction<T, T2, T3, T4> a, Action<T, T2, T3, T4> b)
        {
            a.act -= b;
            SafeAction<T, T2, T3, T4> res = new SafeAction<T, T2, T3, T4>();
            res.act = a.act + b;
            return res;
        }

        public static SafeAction<T, T2, T3, T4> operator -(SafeAction<T, T2, T3, T4> a, Action<T, T2, T3, T4> b)
        {
            SafeAction<T, T2, T3, T4> res = new SafeAction<T, T2, T3, T4>();
            res.act = a.act - b;
            return res;
        }

        public void SafeInvoke(T param, T2 param2, T3 param3, T4 param4)
        {
            act.SafeInvoke(param, param2, param3,param4);
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeAction<T, T2, T3, T4, T5>
    {
        Action<T, T2, T3, T4, T5> act;

        public static implicit operator Action<T, T2, T3, T4, T5>(SafeAction<T, T2, T3, T4, T5> a)
        {
            return a.act;
        }
        
        public static implicit operator SafeAction<T, T2, T3, T4, T5>(Action<T, T2, T3, T4, T5> a)
        {
            SafeAction<T, T2, T3, T4, T5> res = new SafeAction<T, T2, T3, T4, T5>();
            res.act = a;
            return res;
        }
        public static SafeAction<T, T2, T3, T4, T5> operator +(SafeAction<T, T2, T3, T4, T5> a, Action<T, T2, T3, T4, T5> b)
        {
            a.act -= b;
            SafeAction<T, T2, T3, T4, T5> res = new SafeAction<T, T2, T3, T4, T5>();
            res.act = a.act + b;
            return res;
        }

        public static SafeAction<T, T2, T3, T4, T5> operator -(SafeAction<T, T2, T3, T4, T5> a, Action<T, T2, T3, T4, T5> b)
        {
            SafeAction<T, T2, T3, T4, T5> res = new SafeAction<T, T2, T3, T4, T5>();
            res.act = a.act - b;
            return res;
        }

        public void SafeInvoke(T param, T2 param2, T3 param3, T4 param4, T5 param5)
        {
            act.SafeInvoke(param, param2, param3, param4, param5);
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeFunc<T>
    {
        Func<T> act;

        public static implicit operator Func<T>(SafeFunc<T> a)
        {
            return a.act;
        }
        
        public static implicit operator SafeFunc<T>(Func<T> a)
        {
            SafeFunc<T> res = new SafeFunc<T>();
            res.act = a;
            return res;
        }
        public static SafeFunc<T> operator +(SafeFunc<T> a, Func<T> b)
        {
            a.act -= b;
            SafeFunc<T> res = new SafeFunc<T>();
            res.act = a.act + b;

            return res;
        }

        public static SafeFunc<T> operator -(SafeFunc<T> a, Func<T> b)
        {
            SafeFunc<T> res = new SafeFunc<T>();
            res.act = a.act - b;
            return res;
        }

        public T SafeInvoke()
        {
            return act.SafeInvoke();
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeFunc<T, T2>
    {
        Func<T, T2> act;

        public static implicit operator Func<T, T2>(SafeFunc<T, T2> a)
        {
            return a.act;
        }
        public static implicit operator SafeFunc<T, T2>(Func<T, T2> a)
        {
            SafeFunc<T, T2> res = new SafeFunc<T, T2>();
            res.act = a;
            return res;
        }
        public static SafeFunc<T, T2> operator +(SafeFunc<T, T2> a, Func<T, T2> b)
        {
            a.act -= b;
            SafeFunc<T, T2> res = new SafeFunc<T, T2>();
            res.act = a.act + b;

            return res;
        }

        public static SafeFunc<T, T2> operator -(SafeFunc<T, T2> a, Func<T, T2> b)
        {
            SafeFunc<T, T2> res = new SafeFunc<T, T2>();
            res.act = a.act - b;
            return res;
        }

        public T2 SafeInvoke(T param)
        {
            return act.SafeInvoke(param);
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeFunc<T, T2, T3>
    {
        Func<T, T2, T3> act;

        public static implicit operator Func<T, T2, T3>(SafeFunc<T, T2, T3> a)
        {
            return a.act;
        }
        
        public static implicit operator SafeFunc<T, T2, T3>(Func<T, T2, T3> a)
        {
            SafeFunc<T, T2, T3> res = new SafeFunc<T, T2, T3>();
            res.act = a;
            return res;
        }
        public static SafeFunc<T, T2, T3> operator +(SafeFunc<T, T2, T3> a, Func<T, T2, T3> b)
        {
            a.act -= b;
            SafeFunc<T, T2, T3> res = new SafeFunc<T, T2, T3>();
            res.act = a.act + b;

            return res;
        }

        public static SafeFunc<T, T2, T3> operator -(SafeFunc<T, T2, T3> a, Func<T, T2, T3> b)
        {
            SafeFunc<T, T2, T3> res = new SafeFunc<T, T2, T3>();
            res.act = a.act - b;
            return res;
        }

        public T3 SafeInvoke(T param, T2 param2)
        {
            return act.SafeInvoke(param, param2);
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeFunc<T, T2, T3, T4>
    {
        Func<T, T2, T3, T4> act;

        public static implicit operator Func<T, T2, T3, T4>(SafeFunc<T, T2, T3, T4> a)
        {
            return a.act;
        }
        
        public static implicit operator SafeFunc<T, T2, T3, T4>(Func<T, T2, T3, T4> a)
        {
            SafeFunc<T, T2, T3, T4> res = new SafeFunc<T, T2, T3, T4>();
            res.act = a;
            return res;
        }
        public static SafeFunc<T, T2, T3, T4> operator +(SafeFunc<T, T2, T3, T4> a, Func<T, T2, T3, T4> b)
        {
            a.act -= b;
            SafeFunc<T, T2, T3, T4> res = new SafeFunc<T, T2, T3, T4>();
            res.act = a.act + b;

            return res;
        }

        public static SafeFunc<T, T2, T3, T4> operator -(SafeFunc<T, T2, T3, T4> a, Func<T, T2, T3, T4> b)
        {
            SafeFunc<T, T2, T3, T4> res = new SafeFunc<T, T2, T3, T4>();
            res.act = a.act - b;
            return res;
        }

        public T4 SafeInvoke(T param, T2 param2, T3 param3)
        {
            return act.SafeInvoke(param, param2, param3);
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }

    /// <summary>
    /// 能避免重复挂事件的默认委托
    /// </summary>
    public struct SafeFunc<T, T2, T3, T4, T5>
    {
        Func<T, T2, T3, T4, T5> act;

        public static implicit operator Func<T, T2, T3, T4, T5>(SafeFunc<T, T2, T3, T4, T5> a)
        {
            return a.act;
        }
        
        public static implicit operator SafeFunc<T, T2, T3, T4, T5>(Func<T, T2, T3, T4, T5> a)
        {
            SafeFunc<T, T2, T3, T4, T5> res = new SafeFunc<T, T2, T3, T4, T5>();
            res.act = a;
            return res;
        }
        public static SafeFunc<T, T2, T3, T4, T5> operator +(SafeFunc<T, T2, T3, T4, T5> a, Func<T, T2, T3, T4, T5> b)
        {
            a.act -= b;
            SafeFunc<T, T2, T3, T4, T5> res = new SafeFunc<T, T2, T3, T4, T5>();
            res.act = a.act + b;

            return res;
        }

        public static SafeFunc<T, T2, T3, T4, T5> operator -(SafeFunc<T, T2, T3, T4, T5> a, Func<T, T2, T3, T4, T5> b)
        {
            SafeFunc<T, T2, T3, T4, T5> res = new SafeFunc<T, T2, T3, T4, T5>();
            res.act = a.act - b;
            return res;
        }

        public T5 SafeInvoke(T param, T2 param2, T3 param3, T4 param4)
        {
            return act.SafeInvoke(param, param2, param3, param4);
        }

        public bool IsNull
        {
            get
            {
                return act == null;
            }
        }

        public void Dispose()
        {
            act = null;
        }
    }
}

想要实现的效果:

玩家等级变化—> 界面UI变化 / 怪物生成数量变化 /
事件的总类:
与事件相关联的方法的参数类型必须一致, 这里传入的皆为玩家的等级
因为所有事件的触发条件都是玩家等级的变化。

namespace EventCenter
{
    public static class Player
    {
        public static SafeAction<int> LevelChange;
    }

    public static class UI
    {
        public static SafeAction<PlayerInfo> UpdatePlayerInfo; 
    }
}

玩家信息类 : 用来存储玩家数据
PlayerInfo做成一个单例 , level写一个属性, 每次调用set方法时就会调用事件里面的方法。事件里面的方法就是UI和怪物生成数量变化的方法。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerInfo
{
    public int level;
    public int Level
    {
        get
        {
            return level;
        }
        set
        {
            level = value;
            //调用委托里面的方法
            EventCenter.Player.LevelChange.SafeInvoke(level);
        }
    }
    public int hp;
    private static PlayerInfo playerInfo;
    public static PlayerInfo Ins()
    {
        if (playerInfo == null)
        {
            playerInfo = new PlayerInfo();
        }
        return playerInfo;
    }
    public PlayerInfo()
    {
        level = 1;
        UpdateStatus(level);
    }

    public void UpdateStatus(int level)
    {
        Debug.Log("UpdateStatus");
        this.level = level;
        hp  = 10 + level * 2;
        EventCenter.UI.UpdatePlayerInfo.SafeInvoke(this);
    }
}

PlayerController类:
主要就是写等级变化的触发条件:

	using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    void Start()
    {
        EventCenter.Player.LevelChange += PlayerInfo.Ins().UpdateStatus;
    }


    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            PlayerInfo.Ins().Level++;   
            print("level= " + PlayerInfo.Ins().level);
        }
    }
    private void OnDestroy()
    {
        EventCenter.Player.LevelChange -= PlayerInfo.Ins().UpdateStatus;
    }
}

SceneManager类: 根据玩家等级的变化生成怪物数量。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SceneManager :MonoBehaviour
{
    GameObject prefabMonster;


    private void Start()
    {
        prefabMonster = Resources.Load<GameObject>("Monster");
        EventCenter.Player.LevelChange += CreateMonster;
    }

    void CreateMonster(int lv)
    {
        for (int i = 0; i < lv; i++)
        {
            Instantiate(prefabMonster);
        }
    }
    private void Update()
    {
        
    }
    private void OnDestroy()
    {
        EventCenter.Player.LevelChange -= CreateMonster;
    }
}

GameUI类: 界面UI等级数字的变化

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameUI : MonoBehaviour
{
    Text level;
    public void UpdateLevel(int lv)
    {
        level.text = lv.ToString();
    }
    void Start()
    {
        level = transform.Find("Level").GetComponent<Text>();
        EventCenter.Player.LevelChange += UpdateLevel;
    }

  
    void Update()
    {
       
    }
    private void OnDestroy()
    {
        EventCenter.Player.LevelChange -= UpdateLevel;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值