Unityフレームワーク学習_EventManager、シンプルなイベント管理、グローバルイベントシステムの実現が容易

                     Unityフレームワークlearning_EventManagerグローバルイベントシステムを簡単に実現するためのシンプルなイベント管理


目次

1.ブログ投稿の概要

2.コンテンツ

(1)委託を宣言する

(2)メンバーメソッドを定義する

(3)方法の改善

(4)デモンストレーションを使用する

3.プッシュ

4.結論


1.ブログ投稿の概要

       このブロガーは、グローバルイベントを簡単に登録して呼び出すことができるシンプルなイベントシステムを実装しています。当初、ブロガーは任意のパラメーターまたは任意の戻り値を使用してメソッドを実装したいと考えていましたが、メソッド名から直接登録できました。自動的に解決されるイベントシステムとはいえ、その能力には限界があります。最後に、頭を壊したいときに書きませんでした。このようにしかできませんでした。


2.コンテンツ

(1)委託を宣言する

public delegate void EventMgr(params object[] param);

       ここでは、必要に応じてデリゲートを宣言します。これは、パラメーターが固定されていない数である可能性があるため、ここではparams修飾子を使用して無数のパラメーターを表します。

(2)メンバーメソッドを定義する

public interface IEventMgr
{
    void Register(int key, EventMgr eventMgr);//注册事件

    void UnRegister(int key);//解绑事件

    void ClearAll();//解绑所有事件

    bool IsRegisterName(int key);//key值是否被注册

    bool IsRegisterFunc(EventMgr eventMgr);//eventMgr是否被注册

    void Invoke(int key, params object[] param);//调用
}

ここでは、使用する必要のあるメソッドを定義するためのインターフェイスを記述します

(3)方法の改善

    /// <summary>
    /// 存储注册好的事件
    /// </summary>
    protected readonly Dictionary<int,EventMgr> EventListerDict = new Dictionary<int, EventMgr>();

宣言辞書:この辞書には、登録されているすべてのイベントとそれに対応するキー値が格納されます

    /// <summary>
    /// 是否暂停所有的事件
    /// </summary>
    public bool IsPause = false;

ブール値を宣言する:IsPauseは、すべてのイベント呼び出しを一時停止するために使用されます

    public void Register(int key, EventMgr eventMgr)
    {
        if (EventListerDict.ContainsKey(key))
        {
            Debug.LogError("Key:"+key +"已存在!");
        }
        else
        {
            EventListerDict.Add(key,eventMgr);
        }
    }

イベントの登録:メソッドにバインドされたデリゲートeventMgrとそれに対応するキーをディクショナリに追加します

    public void UnRegister(int key)
    {
        if (EventListerDict!=null&&EventListerDict.ContainsKey(key))
        {
            EventListerDict.Remove(key);
            Debug.Log("移除事件:"+key);
        }
        else
        {
            Debug.LogError("Key:"+key +"不存在!");
        }
    }

イベントのバインド解除:登録されたイベントを辞書から削除します

    public  void ClearAll()
    {
        if (EventListerDict!=null)
        {
            EventListerDict.Clear();
            Debug.Log("清空注册事件!");
        }
    }

イベントのクリア:すべてのイベントのバインドを解除し、

   public bool IsRegisterName(int key)
    {
        if (EventListerDict!=null&&EventListerDict.ContainsKey(key))
        {
            EventListerDict.Remove(key);
            Debug.Log("事件:"+key +"已注册!");
            return true;
        }
        Debug.Log("事件:"+key +"未注册!");
        return false;
    }

決定キーの値が登録されているかどうかを確認し、ブール値を返します:キー値が登録されているかどうか

    public bool IsRegisterFunc(EventMgr eventMgr)
    {
        if (EventListerDict!=null&&EventListerDict.ContainsValue(eventMgr))
        {
            Debug.Log("事件已注册!");
            return true;
        }
        Debug.Log("事件未注册!");
        return false;
    }

メソッドが登録されているかどうかを確認します。eventMgrが登録されているかどうかを確認し、bool値を返します。

    public void Invoke(int key,params object[] param)
    {
        if (!IsPause)
        {
            if (EventListerDict.ContainsKey(key))
            {
                EventListerDict[key].Invoke(param);
            }
            else
            {
                Debug.LogError("事件:"+key +"未注册!");
            }
        }
        else
        {
            Debug.LogError("所有事件已暂停!"); 
        }
    }

呼び出しイベント:キー値による呼び出しイベント、無数のパラメーターを渡すことができます

(4)デモンストレーションを使用する

    //被调用方法
    public void TestFunc(params object[] param)
    {
	for (int i = 0; i < param.Length; i++)
	{
	    print(param[i]);
	}
    }
    
    //注册事件 key值为1
    EventManager.Instance.Register(1,TestFunc);

    //调用key为1的事件 传入参数 1 和 “abc”
    EventManager.Instance.Invoke(1,1,"abc");

3.プッシュ

プロジェクトのソースコード:https//github.com/KingSun5/Study_EventManager


4.結論

       実装方法は非常にシンプルです。ブロガーはフォローアップで補足と改善を続けます。ブロガーの記事がうまく書かれていると感じた場合は、ブロガーに注意を払い、ブログ投稿を気に入ってください。さらに、ブロガーの能力は限られています。記事に誤りがある場合は、コメントや批判を歓迎します。

       QQ交換グループ:806091680(中国人)

       このグループは、CSDNブロガーのChinarによって作成されました。お勧めします。私もグループにいます!

       この記事はオリジナル記事ですので、有名作家の出典を転載してトップにこだわってください!

おすすめ

転載: blog.csdn.net/Mr_Sun88/article/details/93144102