案例十一:
该案例主要讲解的是再Unity中对于C#中的委托的一些操作的方法
相比之前的一些例子,如果细心完整的看下来,会发现较开始的例子,这个例子算是比较复杂的了
先从类TestEventListener开始说起,这是一个例子作者自己封装的一个类,里面包含了2种类型的委托和一些委托事件的变量和一些基础的方法
public class TestEventListener : MonoBehaviour
{
public delegate void VoidDelegate(GameObject go);
public delegate void OnClick(GameObject go);
public OnClick onClick = delegate { };
public event OnClick onClickEvent = delegate { };
public void SetOnFinished(OnClick click)
{
Debugger.Log("SetOnFinished OnClick");
}
public void SetOnFinished(VoidDelegate click)
{
Debugger.Log("SetOnFinished VoidDelegate");
}
[NoToLuaAttribute]
public void OnClickEvent(GameObject go)
{
onClickEvent(go);
}
}
这里大家先留下一个概念,后面会用到这个类,然后大家回到脚本TestDelegate这边来,这便是这个例子的入口类
按照惯例,作者一如既往的在Awake里面就几乎做完了所有的基本加载操作,我们都的时候也都是从这里开始:
void Awake()
{
state = new LuaState();
state.Start();
LuaBinder.Bind(state); //加载基本的Warp文件
Bind(state);
state.LogGC = true;
state.DoString(script);
GameObject go = new GameObject("TestGo");
listener = (TestEventListener)go.AddComponent(typeof(TestEventListener));
SetClick1 = state.GetFunction("SetClick1");
AddClick1 = state.GetFunction("AddClick1");
AddClick2 = state.GetFunction("AddClick2");
RemoveClick1 = state.GetFunction("RemoveClick1");
RemoveClick2 = state.GetFunction("RemoveClick2");
TestOverride = state.GetFunction("TestOverride");
AddEvent = state.GetFunction("AddEvent");
RemoveEvent = state.GetFunction("RemoveEvent");
}
首先自然是创建lua虚拟机,然后调用
state.Start() 为虚拟机加载一些标准库。
然后则是使用LuaBinder.Bind(LuaState state) 为该虚拟机中加载一些基本的class类型,就是之前在CustomSetting中添加并Warp的类型
之后的Bind()函数则是为lua虚拟机加载一些该例子特有的类型,平时我们完全可以不通过该方法添加,直接在CustomSetting中添加即可。
然后就是编译读取下面的lua脚本
function DoClick1(go)
print('click1 gameObject is '..go.name)
end
function DoClick2(go)
print('click2 gameObject is '..go.name)
end
function AddClick1(listener) --添加点击事件DoClick1
if li