1.new C#对象
local newGameObj = CS.UnityEngine.GameObject()
local newGameObj2 = CS.UnityEngine.GameObject('helloworld')
print(newGameObj, newGameObj2)
2.访问静态属性,方法
local GameObject = CS.UnityEngine.GameObject
print('UnityEngine.Time.deltaTime:', CS.UnityEngine.Time.deltaTime) --读静态属性
CS.UnityEngine.Time.timeScale = 0.5 --写静态属性
print('helloworld', GameObject.Find('helloworld')) --静态方法调用
3.访问成员属性,方法
local DerivedClass = CS.Tutorial.DerivedClass
local testobj = DerivedClass()--调用构造函数
testobj.DMF = 1024--设置成员属性
print(testobj.DMF)--读取成员属性
testobj:DMFunc()--成员方法
4.重载方法的调用
testobj:TestFunc(100)
testobj:TestFunc('hello')
lua语言没办法区别单精度双精度,所以假设拥有单双精度的重载是按顺序来调用,会调用最上面的那个重载方法。
5.可变参数方法调用
public void VariableParamsFunc(int a, params string[] strs)
{
UnityEngine.Debug.Log("VariableParamsFunc: a =" + a);
foreach (var str in strs)
{
UnityEngine.Debug.Log("str:" + str);
}
}
---lua
testobj:VariableParamsFunc(5, 'hello', 'john')
6.带有结构体的参数的方法
在lua端定义一个表去映射结构体:
public struct MyStruct
{
public string x;
public string y;
}
public void CSharpFunc(MyStruct p)
{
Debug.Log(p.x);
Debug.Log(p.y);
}
--lua
myStructTable={x="C#",y="lua"}
obj:CSharpFunc(myStructTable)
如果是带有接口参数,则和上面相似,不过要在接口的定义上加上[CSharpCallLua]来为接口生成实例代码。具体使用是[CSharpCallLua]还是[LuaCallCSharp]是看由哪方调用的。在这里,如果方法写在C#端,那么肯定由C#端去执行这个接口的业务,也就是说是由C#来执行lua的table的业务,那么实际上在方法的调用上是lua调用C# ,而方法内对接口内方法的调用就是CSharpCallLua.
委托也是和接口一样,打上[CSharpCallLua]并且生成代码,然后由lua端写好function来传入。
7.带有多返回数值的C#方法
C#不是只有一个返回值吗?这里还得算上带有ref out的参数。 看个官方例子:
public double ComplexFunc(Param1 p1, ref int p2, out string p3, Action luafunc, out Action csfunc)
{
Debug.Log("P1 = {x=" + p1.x + ",y=" + p1.y + "},p2 = " + p2);
luafunc();
p2 = p2 * p1.x;
p3 = "hello " + p1.y;
csfunc = () =>
{
Debug.Log("csharp callback invoked!");
};
return 1.23;
}
--lua
local ret, p2, p3, csfunc = testobj:ComplexFunc({x=3, y = 'john'}, 100, function()
print('i am lua callback')
end)
print('ComplexFunc ret:', ret, p2, p3, csfunc)
csfunc()
看起来很复杂,实际上很简单,lua中调用这个方法,传值的时候只传了3个而实际上参数有5个,原因是带out的参数不需要传值。
8.lua中不支持C#的泛型方法,但可以使用扩展方法来调用
直接看官方例子:
public void GenericMethod()
{
Debug.Log("GenericMethod<" + typeof(T) + ">");
}
[LuaCallCSharp]
public static class DerivedClassExtensions
{
public static int GetSomeData(this DerivedClass obj)
{
Debug.Log("GetSomeData ret = " + obj.DMF);
return obj.DMF;
}
public static int GetSomeBaseData(this BaseClass obj)
{
Debug.Log("GetSomeBaseData ret = " + obj.BMF);
return obj.BMF;
}
public static void GenericMethodOfString(this DerivedClass obj)
{
obj.GenericMethod();
}
}
print(testobj:GetSomeData())
print(testobj:GetSomeBaseData()) --访问基类的Extension methods
testobj:GenericMethodOfString() --通过Extension methods实现访问泛化方法
9.事件
public event Action TestEvent;
--lua
local function lua_event_callback1() print('lua_event_callback1') end
local function lua_event_callback2() print('lua_event_callback2') end
testobj:TestEvent('+', lua_event_callback1)
testobj:CallEvent()
testobj:TestEvent('+', lua_event_callback2)
testobj:CallEvent()
testobj:TestEvent('-', lua_event_callback1)
testobj:CallEvent()
testobj:TestEvent('-', lua_event_callback2)
10.委托
public Action TestDelegate = (param) =>
{
Debug.Log("TestDelegate in c#:" + param);
};
--lua
testobj.TestDelegate('hello') --直接调用
local function lua_delegate(str)
print('TestDelegate in lua:', str)
end
testobj.TestDelegate = lua_delegate + testobj.TestDelegate --combine,这里演示的是C#delegate作为右值,左值也支持
testobj.TestDelegate('hello')
testobj.TestDelegate = testobj.TestDelegate - lua_delegate --remove
testobj.TestDelegate('hello')