Uniyt热更新——LuaFrameWork学习(二)按钮点击事件

发表于2018-08-30
评论0 5.6k浏览
上一篇文章我们主要是梳理了一下框架例子的流程,知道了ulua与C#之间的调用,这篇我们接着来学习下框架对UI按钮事件的处理。思路就是点击按钮时调用lua的代码来处理相关的逻辑,那他是怎么实现的呢,不多说直接看源码。

首先我们来看下LuaBehaviour.cs的代码里面有我们想要的东西:
using UnityEngine;
using LuaInterface;
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine.UI;
namespace LuaFramework {
    public class LuaBehaviour : View {
        private string data = null;
        private Dictionary<string, LuaFunction> buttons = new Dictionary<string, LuaFunction>();
        protected void Awake() {
            Util.CallMethod(name, "Awake", gameObject);
        }
        protected void Start() {
            Util.CallMethod(name, "Start");
        }
        protected void OnClick() {
            Util.CallMethod(name, "OnClick");
        }
        protected void OnClickEvent(GameObject go) {
            Util.CallMethod(name, "OnClick", go);
        }
        /// <summary>
        /// 添加单击事件
        /// </summary>
        public void AddClick(GameObject go, LuaFunction luafunc) {
            if (go == null || luafunc == null) return;
            buttons.Add(go.name, luafunc);
            go.GetComponent<Button>().onClick.AddListener(
                delegate() {
                    luafunc.Call(go);
                }
            );
        }
        /// <summary>
        /// 删除单击事件
        /// </summary>
        /// <param name="go"></param>
        public void RemoveClick(GameObject go) {
            if (go == null) return;
            LuaFunction luafunc = null;
            if (buttons.TryGetValue(go.name, out luafunc)) {
                luafunc.Dispose();
                luafunc = null;
                buttons.Remove(go.name);
            }
        }
        /// <summary>
        /// 清除单击事件
        /// </summary>
        public void ClearClick() {
            foreach (var de in buttons) {
                if (de.Value != null) {
                    de.Value.Dispose();
                }
            }
            buttons.Clear();
        }
        //-----------------------------------------------------------------
        protected void OnDestroy() {
            ClearClick();
#if ASYNC_MODE
            string abName = name.ToLower().Replace("panel", "");
            ResManager.UnloadAssetBundle(abName + AppConst.ExtName);
#endif
            Util.ClearMemory();
            Debug.Log("~" + name + " was destroy!");
        }
    }
}

里面的AddClick函数就是我们要看的,通过这个函数我们可以给指定的Button添加OnClick事件,这个事件主要实现了调用Lua函数。Ok,再配合Lua代码我们给对应的Button添加事件,看Lua代码:
prompt = transform:GetComponent('LuaBehaviour');
logWarn("Start lua--->>"..gameObject.name);
prompt:AddClick(PromptPanel.btnOpen, this.OnClick);
function PromptCtrl.OnClick(go)
	if TestProtoType == ProtocalType.BINARY then
		this.TestSendBinary();
	end
	if TestProtoType == ProtocalType.PB_LUA then
		this.TestSendPblua();
	end
	if TestProtoType == ProtocalType.PBC then
		this.TestSendPbc();
	end
	if TestProtoType == ProtocalType.SPROTO then
		this.TestSendSproto();
	end
	logWarn("OnClick---->>>"..go.name);
end 
这里通过调用LuaBehaviour.cs里的AddClick函数给btnOpen按钮添加了OnClick事件,这样当我们点击btnOpen按钮是就会调用Lua里的PromptCtrl.OnClick函数,是不是很简单也很实用。
来自:https://blog.csdn.net/hyf2713/article/details/51800954

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引