这几天过圣诞,各种送礼,各种收礼,感觉 过节==消费,哎…….
下面继续关于uLua的使用学习笔记,这次要写的是一个复杂度高的脚本了,是关于如何在uLua中使用委托的方式.
14.LuaDelegate_1(这是uLua委托的主要程序)
const string script = @"
local func1 = function() print('测试委托1'); end
local func2 = function(gameObj) print('测试委托2:>'..gameObj.name); end
function testDelegate(go)
local ev = go:AddComponent(TestDelegateListener.GetClassType());
---直接赋值模式---
ev.onClick = func1;
---C#的加减模式---
local delegate = DelegateFactory.TestLuaDelegate_VoidDelegate(func2);
ev.onEvClick = ev.onEvClick + delegate;
--ev.onEvClick = ev.onEvClick - delegate;
end
";
void Start () {
LuaScriptMgr mgr = new LuaScriptMgr();
mgr.Start();
mgr.DoString(script);
LuaFunction f = mgr.GetLuaFunction("testDelegate");
f.Call(gameObject); //将自己对象传给lua
}
这里是相关的两个类
public class TestDelegateListener : MonoBehaviour
{
public Action onClick = null;
public TestLuaDelegate.VoidDelegate onEvClick = null;
// Update is called once per frame
void OnGUI() {
if (GUI.Button(new Rect(10, 10, 200, 20), "测试委托1")) {
if (onClick != null) onClick();
}
if (GUI.Button(new Rect(10, 50, 200, 20), "测试委托2")) {
if (onEvClick != null) onEvClick(gameObject);
}
}
}
public class TestLuaDelegate : MonoBehaviour {
public delegate void VoidDelegate(GameObject go);
public VoidDelegate onClick;
}
委托这里有些复杂,但很重要,需要自己理解+实践.
15.LuaDelegate_2(这里是委托的第二种方式)
private string script =
@"
function DoClick1(go)
print('click1 on ', go.name)
end
function DoClick2(go)
print('click2 on ', go.name)
end
local click2 = nil
function AddDelegate(listener)
listener.OnClick = DoClick1
click2 = DelegateFactory.Action_GameObject(DoClick2)
listener.OnClick = listener.OnClick + click2
end
function RemoveDelegate(listener)
listener.OnClick = listener.OnClick - click2
return delegate
end
";
//需要删除的转LuaFunction为委托,不需要删除的直接加或者等于即可
void Start()
{
LuaScriptMgr mgr = new LuaScriptMgr();
mgr.Start();
mgr.DoString(script);
TestEventListener listener = gameObject.AddComponent<TestEventListener>();
LuaFunction func = mgr.GetLuaFunction("AddDelegate");
func.Call(listener);
listener.OnClick(gameObject);
func.Release();
Debug.Log("---------------------------------------------------------------------");
func = mgr.GetLuaFunction("RemoveDelegate");
func.Call(listener);
listener.OnClick(gameObject);
func.Release();
}
以及他的辅助类
public class TestEventListener : MonoBehaviour
{
public Action<GameObject> OnClick = null;
}
相对来说第二种方式代码量要少一些.
虽然说是圣诞节,但是心情确实比较差.不过回头想一下也没有必要,各行各业都有它自己的难出吧,理解真的很重要.
就像写到这里了,谢谢.