Unity-委任メッセージ送受信メカニズムに基づく

7464 ワード

以前のブログで「Unity-オブジェクト向けマルチステートフィーチャーに基づくメッセージ送受信メカニズム」を書いたことがありますが、継承された階層が多く、初心者の学習や使用に不便で、このブログは依頼されたメッセージ送受信メカニズムに基づいています.
イベントコードイベントコードを作成するには、後の異なるメソッドに対応するイベントコードとメソッドが一つ一つ対応している重複できない実行メソッドの唯一の識別メソッドに相当するアイデンティティである
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// 
///     
/// 
public class EventCode
{
    /// 
    /// UI
    /// 
    public const int UI_StartPanelActive = 10000;


    /// 
    /// Net
    /// 
    public const int Net_Send = 20000;
}

消息中心
消息中心作用是对事件的注册 执行和移除的处理

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

public class MessageCenter : MonoBehaviour {

    public static MessageCenter Instance;
    /// 
    ///  
    /// 
    private Dictionary<int, Action<object>> messageCenterDict = new Dictionary<int, Action<object>>();
    private void Awake()
    {
        Instance = this;
    }

    public void Dispatcher(int eventCode,object message)
    {
        if (messageCenterDict.ContainsKey(eventCode))
        {
            messageCenterDict[eventCode].Invoke(message);
        }
    }

    /// 
    ///  
    /// 
    public void AddListener(int eventCode, Action<object> action)
    {
        if (!messageCenterDict.ContainsKey(eventCode))
        {
            messageCenterDict.Add(eventCode, action);
        }
    }
    /// 
    ///  
    /// 
    /// 
    public void RemoveAddlistener(int eventCode)
    {
        if (messageCenterDict.ContainsKey(eventCode))
        {
            messageCenterDict.Remove(eventCode);
        }
    }
}

测试代码

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

public class UIButton : MonoBehaviour {

    // Use this for initialization
    void Start () {
        // 
        MessageCenter.Instance.AddListener(EventCode.UI_StartPanelActive, Test);
    }
    public void Test(object num)
    {
        //      Demo 
        Debug.Log((int)num);
    }

    private void OnDestroy()
    {
        // 
        MessageCenter.Instance.RemoveAddlistener(EventCode.UI_StartPanelActive);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RoomButton : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        // 
        // 
        if (Input.GetMouseButtonDown(0))
        {
            MessageCenter.Instance.Dispatcher(EventCode.UI_StartPanelActive, 2);
        }
    }
}