プロジェクト後期Luaアクセスノート06--ボタンイベントの傍受とメッセージ配信

4586 ワード

ボタンイベントリスニングNGUIは一般的にUIIEvenetListenerとして一般的に使用されており、使用方法は以下の通りである.
UIEventListener.Get(gameObject).onClick = BtnClick;

Luaコードでの使い方も悪くない
UIEventListener.Get(gameObject).onClick = this.BtnClick;

メッセージ配信については、Luaには同様の機能を実現するEventがありますが、私たちのニーズはlua内部配信だけでなく、他のluaに変更されていないスクリプトにも関連しています.そのため、私たちは自分のゲームフレームワーク内のメッセージメカニズムを使用しています.基礎原理は以前の文章を参照することができます.では、Luaで使用するには、どのように使用するか、ここでいくつかの修正が必要です.現在のluaコールバックを格納する辞書を定義します
static public Dictionary<int, List> luaEventTable = new Dictionary<int, List>();

次にlua呼び出しに対するメッセージメカニズムを書きます
static public void LuaAddListener(int eventType, LuaFunction lf)
    {
        if (luaEventTable.ContainsKey(eventType))
        {
            luaEventTable[eventType].Add(lf);
        }
        else
        {
            List list = new List();
            list.Add(LuaFunction);
            luaEventTable.Add(eventType, list);
        }
    }

    static public void LuaRemoveListener(int eventType, LuaFunction lf)
    {
         if (luaEventTable.ContainsKey(eventType))
         {
             if (luaEventTable[eventType].Contains(lf))
             {
                 luaEventTable[eventType].Remove(lf);
              }
          }
    }


    static public void LuaBroadcast(int eventType, params object[] obj)
    {
        Broadcast2Lua(eventType, obj);

        Delegate d;
        if (eventTable.TryGetValue(eventType, out d))
        {
             d.DynamicInvoke(obj);
        }
    }

   static private void Broadcast2Lua(int eventType, params object[] obj)
    {
            List list = null;
            if (luaEventTable.TryGetValue(eventType, out list))
            {
                for (int j = 0; j < list.Count; j++)
                {
                    list[j].Call(obj);
                }
            }
    }

ここで主なコードはluaから送られてきた情報で、複数のパラメータがあり、c#の中のメッセージデータは汎用的な制約を行い、APIコードを見てこの関数を発見し、ちょうど私たちのニーズを満たしています.
d.DynamicInvoke(obj);

書き終わったらこのようなwrapをluaに使用し、luaでコードを呼び出すのは以下の通りです.
Messege.LuaAddListener(MessageID.LuaTest, this.Test);
Messege.LuaRemoveListener(MessageID.LuaTest, this.Test);
Messege.LuaBroadcast(MessageID.LuaTest, arg1,arg2,arg3);