Unity中使用SLua的一些注意事项

1、SLua中不支持参数默认值。

    public void ShowEffectById(int id = 0, OnCallBack callBack = null, int layerint = 5)

如上面的函数,如果在Lua中使用 ShowEffectById(1012) ,会报错

expect valid delegate

所以要传入所有的参数
ShowEffectById(1012,nil,5)

2、LuaTimer用于在限定时间周期性的回调lua函数,里面的时间参数单位是毫秒

    --5s后开始,每隔2s执行一次,return true表示持续回调,不写或return false表示执行一次
    LuaTimer.Add(5000,2000,function(id)
        print("hello world!")
        return true
    end)

    --2s后执行
    LuaTimer.Add(2000,function(id)
        print("hello world!")
    end)

3、在Lua中需要传List 参数到Wrap的函数中
比如我需要传一个 List 的参数到C#的函数中,那么要按照下面的步骤
首先定义一个类 IntList 用来导出到Lua中

    [CustomLuaClass]
    public class IntList : List { }

然后在Lua中使用

    local ll=XXList() -- it's List
    	ll:Add(1)
    	print(ll.Count)

4、对于proto-lua-gen 如果一个message 中有一个 extensions ,但是这个 extensions是一个空的 message 像下面

    --Student.protp
     
    message Student
    {
      	required int32 id = 1;
     
      	extensions 10 to max;
    }
     
    message Phone
    {
    	extend Student
    	{
    	  repeated Phone phones = 10;
    	}
    }

那么要注意,序列化 Student 的时候,千万不要手贱去获取 extensions ,然后序列化 ,会卡死的!!

    local student= Student_pb.Person()
    local phone = student.Extensions[Student_pb.Phone.phones]
    local data = student:SerializeToString()   --卡死

如果 extensions 的message 是空的,就不要去管他,这样写

    local student= Student_pb.Person()
    local data = student:SerializeToString()   --正常

然后在 游戏中 空的 message 的话,虽然可以不去获取 extensions来避免崩溃卡死,但是这样的数据会出问题,所以对于之前的空的message,我们就设置一个 optional的值 。然后在 代码中使用这个message的时候一定要记得设置这个optional的值。


5、在SLua中使用List。首先要导出你要使用的类的List,比如你要在Lua中使用 List .那么首先把添加到导出列表

    add(typeof(List), "ListString");

然后在Lua中使用

    local stringlist=ListString()
    stringlist:Add("haha")


你可能感兴趣的:(Unity3d热更新,--,SLua)