Unity Xlua 之 Lua调用C#(三)

Unity Xlua 之 Lua调用C#(三)

一.Lua使用C#委托和事件

public class Lesson7
{
    public UnityAction action;
    public event UnityAction eventAction;
    public void DoEvent()
    {
        eventAction?.Invoke();
    }
    public void ClearEvent()
    {
        eventAction = null;
    }
}
Lesson7 = CS.Lesson7
local l7 = Lesson7()

function Fun()
    print("Func执行!")
end

--开始委托为空值,需要先赋值在相加
l7.action = Fun
l7.action = l7.action + Fun
l7.action()
l7.action = l7.action - Fun
l7.action = nil--清空可以直接置空
l7.action = Fun
l7.action()

print("=====Event=====")
l7:eventAction("+",Fun)
l7:eventAction("+",Fun)
l7:eventAction("+",Fun)
l7:eventAction("+",Fun)
l7:eventAction("+",Fun)
l7:DoEvent()
print("=====Event减去=====")
l7:eventAction("-",Fun)
l7:eventAction("-",Fun)
--l7.eventAction = nil  清空不可以直接置空,需要在Unity中添加函数
l7:ClearEvent()
l7:DoEvent()

二.Lua使用C#二维数组

  • Lua中不能直接使用[index]来获取二维数组中的元素
public class Lesson8
{
    public int[,] array = { { 1, 2, 3 }, { 1, 2, 3 } };
}
Lesson8 = CS.Lesson8
local l8 = Lesson8()
print(l8.array:GetLength(0))
print(l8.array:GetLength(1))

for i = 0, l8.array:GetLength(0) - 1 do
    for j = 0, l8.array:GetLength(1) - 1 do
        print(l8.array:GetValue(i, j))
    end
end

三.C# null和Lua nil比较

  • C#中的null和Lua中的nil不一定一样,需要自己封装一个函数进行判断
public class Lesson9
{
    public Lesson lesson = null;
}
Lesson9 = CS.Lesson9
local l9 = Lesson9()
--对于object类可以这样判空
if l9.lesson == nil then
    print("空对象")
else
    print("非空对象")
end

GameObject = CS.UnityEngine.GameObject
Rigidbody = CS.UnityEngine.Rigidbody

local obj = GameObject("zzs")
local rigiComponent = obj:GetComponent(typeof(Rigidbody))
--对于Object类需要Equals判断
if (rigiComponent:Equals(nil)) then
    rigiComponent = obj:AddComponent(typeof(Rigidbody))
end
print(rigiComponent)
--解决方案一,在主函数中添加全局判空函数IsNull()
print(IsNull(rigiComponent))
rigiComponent = nil
print(IsNull(rigiComponent))
print("==============")
print(IsNull(l9.lesson))
--解决方案二,在C#中拓展Object方法

你可能感兴趣的:(Xlua,lua,unity,c#)