关于unity+lua接入sdk 热更的实践

游戏业务逻辑是需要配合lua去实现热更的.

但是由于本人是真的对lua不熟,语法上的亏让我走了许多弯路.
游戏使用tolua# 自动注册到lua使用方便支持各种数据类型

思路(经过踩坑总结下)

1.unity 挂载的脚本全局的.里面有唤起各个平台的sdk函数,以及用于接收sdk回调的委托,sdk成功后委托invoke即可调到lua中跑业务逻辑
2.全局脚本生成lua wrap bind 大致了解了tolua的底层原理(开始踩坑的时候不知道这个居然是自动生成的.然后特么自己还去仿写了一套,还认为自定义的需要各种注册啥的吧,也没人给我说啊...)
3.lua这边调用设置委托,实现回调后的业务逻辑ok大功告成
tolua 集成时 遇到坑, 生成wrap和那些 有些时候老是不成功.不要急
后来多次试验发现有些时候能生成成功有时不能 总结之下发现1.vs编译的时候是生成不了的2.vs修改后会有个编译过程这时 也是不能生成的.什么意思等等的意思3.自己要生成的cs文件如果放在script文件目录下生成不了,可以尝试换个文件夹,或者复制一份到其他文件夹,就成功了,怪啊 .然后可能会重复文件删掉就好了.
4.过程中有可能始终生成不了wrap 和 delegatefactory文件的话,可以试试关闭vs,重新打开脚本清理项目再重新 生成

lua这边调用的坑
比如 有这个样个委托

class  MyCustomChannel
 public  delegate void  MessageCallback(string data,int errcode)
 public  gainServerData(MessageCallback cls) {
         //do something 
         cls("your data",200)
}

对lua是没碰过的,unity 的游戏逻辑一些api用哪些都不清楚
于是我写出了这样的代码

MyCustomChannel.Instance:gainServerData(self.callback)
//等价
//func    AnyView:(self,data,code)
func    AnyView:callback(data,code){
              print(self,data,code)
              //效果变成了
            //  your data, 200,nil
            //这里 self 就变成了字符串是很骚的情况
 }

看到这样的情况我很吃惊,刷新我的认知,后来发现是自己不懂这块脚本是类似静态实例化和实例化对象的调用区别具体 如何避免这样的呢

1.直接闭包方式处理
 MyCustomChannel.Instance:gainServerData(function (data,errcode)  
                    //do  something 
                    print(self,data,errcode)
end)
2.静态方法处理  这种方式类似静态方法 
localdata = {}
aview = self
func    callback(data,code){
              print(data,code)
             localdata[1] = data
            //后续处理
            aview:NextOp()
 }  

整个过程其实很难受,因为是脚本语言然后全局全靠print很难受,调试都没debug,心酸车祸现场,不过最终搞懂这块是如何自动生成的,并且自己还特么居然自己去写了一部分的模拟(好吧,自动生成才是王道),不过踩完这些坑,回调如何写的一次性就把所有的流程,写好,运行跑通还是很有便秘疏通的感觉

你可能感兴趣的:(关于unity+lua接入sdk 热更的实践)