• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Lua快速入门篇(XLua教程)(Yanlz+热更新+xLua+配置+热补丁+第三方库+API+二次开发+ ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

                        《Lua热更新》

##《Lua热更新》发布说明:

++++“Lua热更新”开始了,立钻哥哥终于开始此部分的探索了。

++++作为游戏发布迭代的重要技术:Lua热更新在网络游戏迭代更新中非常重要,特别是对于AppStore这样的平台,我们只需要定期更新主App,原则上可以随时灵活更新我们的以Lua热更新框架为基础的代码。

++++当然,作为一项新引入的技术,我们通常是以【快速入门】=>【基础夯实】=>【中级进阶】=>【高级实战】=>【立钻哥哥带您学Lua热更新】等几个阶段进行探索。

 

##《Lua热更新》目录:

#第一篇:Lua快速入门篇

#第二篇:Lua基础夯实篇

#第三篇:Lua中级进阶篇

#第四篇:Lua高级实战篇

#第五篇:立钻哥哥带您学Lua热更新

 

++++Lua快速入门篇(XLua拓展):https://blog.csdn.net/VRunSoftYanlz/article/details/81173818

++++Lua快速入门篇(XLua教程):https://blog.csdn.net/VRunSoftYanlz/article/details/81141502

++++Lua快速入门篇(基础概述)https://blog.csdn.net/VRunSoftYanlz/article/details/81041359

 

 

 

#第一篇:Lua快速入门篇

#第一篇:Lua快速入门篇

++++第一章:Lua基础概述

++++第二章:xLua教程

++++第三章:Lua基础拓展

++++第四章:立钻哥哥带您学Lua热更新

 

 

##第二章:xLua教程

++第二章:xLua教程

++++https://github.com/Tencent/xLua

++++xLua为Unity、.Net、Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。

++++2.1、xLua教程

++++2.2、xLua的配置

++++2.3、热补丁操作指南

++++2.4、XLua增加删除第三方lua库

++++2.5、xLua API

++++2.6、生成引擎二次开发指南

++++2.7、xLua常见问题

++++2.8、xLua示例参考

++++2.9、xLua拓展总结

++++2.10、立钻哥哥带您学xLua

 

 

###2.1、xLua入门教程

###2.1、xLua入门教程

++2.1、xLua入门教程

++++xLua教程:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua教程.md

++++2.1.1、Lua文件加载

++++2.1.2、C#访问Lua

++++2.1.3、Lua调用C#

 

++2.1.1、Lua文件加载

++++Lua文件加载:1、执行字符串;2、加载Lua文件;3、自定义Loader;

++++1、执行字符串(不推荐使用)

--最基本是直接用LuaEnv.DoString()执行一个字符串(字符串得符合Lua语法):

    ----luaenv.DoString(print(立钻哥哥))

++++2、加载Lua文件

--用lua的require函数即可:

    ----DoString(require byfile’”);

--require实际上是调用一个个的loader去加载,有一个成功就不再往下尝试,全失败则报文件找不到。(目前xLua除了原生的loader外,还添加了从Resource加载的loader,需要注意的是因为Resource只支持有限的后缀,放Resource下的Lua文件得加上txt后缀。)

--建议加载Lua脚本方式是:整个程序就一个DoString(“require ‘main’”),然后在main.lua加载其它脚本(类似lua脚本的命令执行:lua main.lua)

++++3、自定义Loader

--在xLua加自定义loader是很简单的,只涉及到一个接口:

    ----public delegate byte[] CustomLoader(ref string filepath);

    ----public void LuaEnv.AddLoader(CustomLoader loader)

--通过AddLoader可以注册一个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件,如果需要支持调试,需要把filepath修改为真实路径传出。(该回调返回一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。)

 

++2.1.2、C#访问Lua

++++这里指的是C#主动发起对Lua数据结构的访问。

++++1、获取一个全局基本数据类型

--访问LuaEnv.Global就可以了。

--luaenv.Global.Get<int>(a)

--luaenv.Global.Get<string>(b)

--luaenv.Global.Get<bool>(c)

++++2、访问一个全局的table

--2.1、映射到普通class或struct:

    ----定义一个class,有对应于table的字段的public属性,而且有无参数构造函数即可,比如对于{  f1 = 100, f2 = 100  }可以定义一个包含public int f1; public int f2;的class。

    ----table属性可多于或者少于class的属性。可以嵌套其它复杂类型。(立钻哥哥:这个过程是值拷贝,如果class比较复杂代价会比较大。)

    ----这个功能可以通过把类型加到GCOptimize生成降低开销。

--2.2、映射到一个interface:

    ----这种方式依赖于生成代码(如果没生成代码会抛InvalidCastException异常),代码生成器会生成这个interface的实例,如果get一个属性,生成代码会get对应的table字段,如果set属性也会设置对应的字段。(甚至可以通过interface的方法访问lua的函数。)

--2.3、更轻量级的by value方式:映射到Dictionary<>, List<>:

    ----不想定义class或者interface的话,可以考虑用这个,前提table下key和value的类型都是一致的。

--2.4、另外一种by ref方式:映射到LuaTable类:

    ----这种方式好处是不需要生成代码,但也有一些问题,比较慢,没有类型检查。

++++3、访问一个全局的function

--仍然是用Get方法,不同的是类型映射。

--3.1、映射到delegate:

    ----这种是建议的方式,性能好很多,而且类型安全。(缺点是要生成代码(如果没生成代码会抛InvalidCastException异常))。

    ----delegate要怎样声明呢?对于function的每个参数就声明一个输入类型的参数。(多返回值要怎么处理?从左往右映射到C#的输出参数,输出参数包括返回值,out参数,ref参数。)

    ----参数、返回值类型支持哪些呢?(都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。)

    ----delegate的使用就更简单了,直接像个函数那样用就可以了。

--3.2、映射到LuaFunction:

    ----这种方式的优缺点刚好和第一种相反。(使用也简单,LuaFunction上有个变参的Call函数,可以传任意类型,任意个数的参数,返回值是object的数组,对应于lua的多返回值。)

++++4、使用建议

--4.1、访问lua全局数据,特别是table以及function,代价比较大,建议尽量少做,比如在初始化时要调用的lua function获取一次(映射到delegate)后,保存下来,后续直接调用该delegate即可。(table也类似)

--4.2、如果lua侧的实现的部分都以delegate和interface的方式提供,使用方可以完全和xLua解耦;由一个专门的模块负责xLua的初始化以及delegate、interface的映射,然后把这些delegate和interface设置到要用到它们的地方。

 

++2.1.3、Lua调用C#

++++lua调用C#:new C#对象;访问C#静态属性,方法;访问C#成员属性,方法;

++++【new C#对象】

--可以像C#这样new一个对象:

    ----var newGameObj = new UnityEngine.GameObject();    //C#

    ----local newGameObject = CS.UnityEngine.GameObject();    //lua

--基本类似,除了:1、lua里头没有new关键字;2、所有C#相关的都放到CS下,包括构造函数,静态成员属性、方法;

--xLua支持重载(多个构造函数等),比如调用GameObject的带一个string参数的构造函数:

    ----local newGameObj2 = CS.UnityEngine.GameObject(立钻哥哥)

++++【访问C#静态属性,方法】

--【读静态属性】:CS.UnityEngine.Time.deltaTime

--【写静态属性】:CS.UnityEngine.Time.timeScale = 0.5

--【调用静态方法】:CS.UnityEngine.GameObject.Find(立钻哥哥)

    ----立钻哥哥:如果需要经常访问的类,可以先用局部变量引用后访问,除了减少敲代码的时间,还能提高性能:

        ------local GameObject = CS.UnityEngine.GameObject

        ------GameObject.Find(立钻哥哥)

++++【访问C#成员属性,方法】

--【读成员属性】:testObj.YanlzScore

--【写成员属性】:testObj.YanlzScore = 1024

--【调用成员方法】:调用成员方法,第一参数需要传该对象,建议用冒号语法糖:

    ----testobj:MyTestFunc()

--【父类属性,方法】:

    ----xLua支持(通过派生类)访问基类的静态属性,静态方法,(通过派生类实例)访问基类的成员属性,成员方法。

--【参数的输入输出属性(out, ref)】:

    ----Lua调用侧的参数处理规则:C#的普通参数算一个输入形参,ref修饰的算一个输入形参,out不算,然后从左往右对应lua调用侧的实参列表。

    ----Lua调用侧的返回值处理规则:C#函数的返回值(如果有的话)算一个返回值,out算一个返回值,ref算一个返回值,然后从左往右对应lua的多返回值。

--【重载方法】:直接通过不同的参数类型进行重载函数的访问:

    ----testobj:TestFunc(100)

    ----testobj:TestFunc(立钻哥哥)

    ----立钻哥哥:xLua只一定程度上支持重载函数的调用,因为lua的类型远远不如C#丰富,存在一对多的情况,比如C#的int,float,double都对应于lua的number。

--【操作符】:支持操作符有:+,-,*,/,==,<,<=,%,[]

--【参数带默认值的方法】:和C#调用有默认值参数的函数一样,如果所给的实参少于形参,则会用默认值补上。

--【可变参数方法】:

    --C#:void VariableParamsFunc(int a, params string[] strs);

    --lua:testobj:VariableParamsFunc(5, hello, 立钻哥哥)

--【使用Extension methods】:在C#里定义了,lua里就能直接使用。

--【泛化(模板)方法】:不直接支持,可以通过Extension methods功能进行封装后调用。

--【枚举类型】:枚举值就像枚举类型下的静态属性一样。

    ----testobj:EnumTestFunc(CS.Tutorial.TestEnum.E1)  

    ----枚举类支持__CastFrom方法,可以实现从一个整数或者字符串到枚举值的转换:

        ------CS.Tutorial.TestEnum.__CastFrom(1)

        ------CS.Tutorial.TestEnum.__CastFrom(E1)

--【delegate使用(调用,+,-)】:

    ----C#的delegate调用:和调用普通lua函数一样;

  ----操作符+:对应C#的+操作符,把两个调用串成一个调用链,右操作数可以是同类型的C# delegate或者是lua函数。

    ----操作符-:和+相反,把一个delegate从调用链中移除。

    ----立钻哥哥:delegate属性可以用一个luafunction来赋值。

--【event】:比如testobj里头有事件定义是这样:public event Action TestEvent;

    ----增加事件回调:testobj:TestEvent(+, lua_event_callback)

    ----移除事件回调:testobj:TestEvent(-, lua_event_callback)

--【64位整数支持】:

    ----Lua53版本64位整数(long, ulong)映射到原生的64位整数,而luajit版本,相当于lua5.1标准,本身不支持64位,xlua做了个64位支持的扩展库,C#的long和ulong都将映射到userdate:

        ------支持在lua里头进行64位的运算,比较,打印;

        ------支持和lua number的运算,比较;

        ------立钻哥哥:在64位扩展库中,实际上只有int64,ulong也会强转成long再传递到lua,而对ulong的一些运算,比较,我们采取和java一样的支持方式,提供一组API。

--【C#复杂类型和table的自动转换】:对于一个无参构造函数的C#复杂类型,在lua侧可以直接用一个table来代替,该table对复杂类型的public字段有相应字段即可,支持函数参数传递,属性赋值等。

--【获取类型(相当于C#的typeof)】:

    ----比如要获取UnityEngine.ParticleSystem类的Type信息,可以这样:

        ----typeof(CS.UnityEngine.ParticleSystem)

--【“强”转】:lua没有类型,所以不会有强类型语言的“强转”。

    ----但有个有点像的东西:告诉xLua要用指定的生成代码去调用一个对象,这在什么情况下能用到呢?

    ----有的时候第三方库对外暴露的是一个interface或者抽象类,实现类的隐藏的,这样我们无法对实现类进行代码生成。

    ----该实现类将会被xLua识别为未生成代码而用反射来访问,如果这个调用是很频繁的话还是很影响性能的,这时我们就可以把这个interface或者抽象类加到生成代码,然后指定用该生成代码来访问:

        ----cast(calc, typeof(CS.Tutorial.Calc))

 

 

 

###2.2、xLua的配置

###2.2、xLua的配置

++2.2、xLua的配置

++++xLua的配置:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/configure.md

++++xLua所有的配置都支持三种方式:打标签;静态列表;动态列表;

++++xLua配置有两必须和两建议:

--必须1:列表方式均必须是static的字段/属性;

--必须2:列表方式均必须放到一个static类;

--建议1:不用标签方式;

--建议2:列表方式配置放Editor目录(如果是Hotfix配置,而且类位于Assembly-CSharp.dll之外的其他dll,必须放Editor目录)

++++2.2.0、立钻哥哥带您xLua配置

++++2.2.1、打标签

++++2.2.2、静态列表

++++2.2.3、动态列表

++++2.2.4、XLua.LuaCallCSharp

++++2.2.5、XLua.ReflectionUse

++++2.2.6、XLua.DoNotGen

++++2.2.7、XLua.CSharpCallLua

++++2.2.8、XLua.GCOptimize

++++2.2.9、XLua.AdditionalProperties

++++2.2.10、XLua.BlackList

++++2.2.11、CSObjectWrapEditor.GenPath

++++2.2.12、CSObjectWrapEditor.GenCodeMenu

++++2.2.13、立钻哥哥带您xLua配置

 

++2.2.1、打标签(不推荐使用)

++++xLua用白名单来指明生成哪些代码,而白名单通过attribute来配置;

++++比如想从lua调用C#某个类,希望生成适配代码,可以为这个类型打一个LuaCallCSharp标签:

[LuaCallCSharp]

public class A{

}

++++该方式方便,但在il2cpp下会增加不少的代码量,不建议使用。

 

++2.2.2、静态列表

++++有时我们无法直接给一个类型打标签,比如系统api,没源码的库,或者实例化的泛化类型,这时可以在一个静态类里声明一个静态字段,该字段的类型除[BlackList][AdditionalProperties]之外只要实现了IEnumerable<Type>就可以了。

[LuaCallCSharp]

public static List<Type> mymodule_lua_call_cs_list = new List<Type>(){

    typeof(GameObject),

    typeof(Dictionary<string, int>),

};

++++这个字段需要放到一个静态类里头,建议放到Editor目录。

 

++2.2.3、动态列表

++++声明一个静态属性,打上相应的标签即可。

[Hotfix]

public static List<Type> by_property{

    get{

        return (

            from type in Assembly.Load(Assembly-CSharp).GetTypes()

            where type.Namespace == XXXX

            select type).ToList();

    }

}

++++Getter是代码,可以实现很多效果,比如按名字空间配置,按程序集配置等等。

++++这个属性需要放到一个静态类里头,建议放到Editor目录。

 

++2.2.4、XLua.LuaCallCSharp

++++一个C#类型加了这个配置,xLua会生成这个类型的适配代码(包括构造该类型实例,访问其成员属性、方法,静态属性、方法),否则将会尝试用性能较低的反射方式来访问。

++++一个类型的扩展方法(Extension Methods)加了这配置,也会生成适配代码并追加到被扩展类型的成员方法上。

++++xLua只会生成加了该配置的类型,不会自动生成其父类的适配代码,当访问子类对象的父类方法,如果该父类加了[LuaCallCSharp]配置,则执行父类的适配代码,否则会尝试用反射来访问。

++++反射访问除了性能不佳之外,在il2cpp下还有可能因为代码剪裁而导致无法访问,后者可以通过[ReflectionUse]标签来避免。

 

++2.2.5、XLua.ReflectionUse

++++一个C#类型加了这个配置,xLua会生成link.xml阻止il2cpp的代码剪裁。

++++对于扩展方法,必须加上[LuaCallCSharp]或者[ReflectionUse]才可以被访问到。

++++建议所有要在Lua访问的类型,要么加[LuaCallCSharp],要么加上[ReflectionUse],这才能够保住在各平台都能正常运行。

 

++2.2.6、XLua.DoNotGen

++++指明一个类里头的部分函数、字段、属性不生成代码,通过反射访问。

++++标准Dictionary<Type, List>的field或者property。(key指明的是生效的类,value是一个列表,配置的是不生成代码的函数、字段、属性的名字。)

++++[DoNotGen][ReflectionUse]的区别是:

--1、[ReflectionUse]指明的是整个类;

--2、当第一次访问一个函数(字段、属性)时,[ReflectionUse]会把整个类都wrap,而[DoNotGen]只wrap该函数(字段、属性),换句话[DoNotGen]更lazy一些;

++++[DoNotGen][BlackList]的区别:

--1、[BlackList]配了就不能用;

--2、[BlackList]能指明某重载函数,[DoNotGen]不能;

 

++2.2.7、XLua.CSharpCallLua

++++如果希望把一个lua函数适配到一个C# delegate(

--一类是C#侧各种回调:UI事件,delegate参数,比如List<T>:ForEach;

--另外一类场景是通过LuaTable的Get函数指明一个lua函数绑定到一个delegate)。

++++或者把一个lua table适配到一个C# interface,该delegate或者interface需要加上该配置。

 

++2.2.8、XLua.GCOptimize

++++一个C#纯值类型(立钻哥哥:指的是一个只包含值类型的struct,可以嵌套其它只包含值类型的struct)或者C#枚举值加上了这个配置。

++++xLua会为该类型生成gc优化代码,效果是该值类型在lua和C#间传递不产生(C#)gc alloc,该类型的数组访问也不产生gc。各种无GC的场景。

++++除枚举之外,包含无参构造函数的复杂类型,都会生成lua table到该类型,以及该类型的一维数组的转换代码,这将会优化这个转换的性能,包括更少的gc alloc。

 

++2.2.9、XLua.AdditionalProperties

++++这个是[GCOptimize]的扩展配置,有的时候,一些struct喜欢把field做成是私有的,通过property来访问field,这时就需要用到该配置(默认情况下[GCOptimize]只对public的field打解包。)

++++标签方式比较简单,配置方式复杂一些,要求是Dictionary<Type, List<string>>类型,Dictionary的Key是要生效的类型,Value是属性名列表。

++++可以参考XLua对几个UnityEngine下值类型的配置,SysGCOptimize类等。

 

++2.2.10、XLua.BlackList

++++如果不要生成一个类型的一些成员的适配代码,可以通过这个配置来实现。

++++标签方式比较简单,对应的成员上加上就可以了。

++++由于考虑到有可能需要把重载函数的其中一个重载列入黑名单,配置方式比较复杂,类型是List<List<string>>,对于每个成员,

--在第一层List有一个条目,

--第二层List是个string的列表,

--第一个string是类型的全路径名,

--第二个string是成员名,

++++如果成员是一个方法,还需要从第三个string开始,把其参数的类型全路径全列出来。

++++例如:对GameObject的一个属性以及FileInfo的一个方法列入黑名单[BlackList]

[BlackList]

public static List<List<string>> BlackList = new List<List<string>>(){

    new List<string>(){  UnityEngine.GameObject,  networkView  },

    new List<string>(){  System.IO.FileInfo,  GetAccessControl,  System.Security.AccessControl.AccessControlSections  },

};

 

++2.2.11、CSObjectWrapEditor.GenPath

++++立钻哥哥:生成期配置,必须放到Editor目录下。

++++配置生成代码的放置路径,类型是string。

++++默认放在“Assets/XLua/Gen/”下。

 

++2.2.12、CSObjectWrapEditor.GenCodeMenu

++++立钻哥哥:生成期配置,必须放到Editor目录下。

++++该配置用于生成引擎的二次开发,一个无参数函数加上了这个标签,在执行“XLua/Generate Code”菜单时会触发这个函数的调用。

 

 

 

 

###2.3、热补丁操作指南

###2.3、热补丁操作指南

++2.3、热补丁操作指南

++++https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md

++++热补丁操作指南:使用方式;约束;API;标识要热更新的类型;使用建议;打补丁;

++++2.3.1、使用方式

++++2.3.2、约束

++++2.3.3、API

++++2.3.4、标识要热更新的类型

++++2.3.5、使用建议

++++2.3.6、打补丁

 

++2.3.1、使用方式

++++步骤1:添加HOTFIX_ENABLE宏打开该特性(在Unity3D的File->Build Setting->Scripting Define Symbols下添加)。

--立钻哥哥:编辑器、各手机平台这个宏要分别设置!

--如果是自动打包,立钻哥哥:在代码里头用API设置的宏是不生效的,需要在编辑器设置。

--立钻哥哥建议:平时开发业务代码不打开HOTFIX_ENABLE,只在build手机版本或者要在编辑器下开发补丁时打开HOTFIX_ENABLE

++++步骤2:执行“XLua/Generate Code”菜单;

++++步骤3:注入,构建手机包这个步骤会在构建时自动进行,编辑器下开发补丁需要手动执行“XLua/Hotfix Inject In Editor”菜单。(注入成功会打印:“hotfix inject finish!”或者“立钻哥哥:had injected!”)

 

++2.3.2、约束

++++立钻哥哥:不支持静态构造函数。

++++目前只支持Assets下代码的热补丁(不支持引擎、C#系统库的热补丁)。

 

++2.3.3、API

++++立钻哥哥:xlua.hotfix(class, [method_name], fix)

--描述:注入lua补丁;

--class:C#类,两种表示方法:

----CS.Namespace.TypeName或者字符串方式“Namespace.TypeName”,

----字符串格式和C#的Type.GetType要求一致,如果是内嵌类型(Nested Type)是非Public类型的话,只能用字符串方式表示:“Namespace.TypeName+NestedTypeName”;

--method_name:方法名,可选;

--fix:如果传了method_name, fix将会是一个function,否则通过table提供一组函数。(table的组织按key是method_name, value是function的方式)

++++立钻哥哥:base(csobj)

--描述:子类override函数通过base调用父类实现。

--csobj:对象;

--返回值:新对象,可以通过该对象base上的方法。

++++立钻哥哥:util.hotfix_ex(class, method_name, fix)

--描述:xlua.hotfix的增强版本,可以在fix函数里头执行原来的函数,缺点是fix的执行会略慢。

--method_name:方法名;

--fix:用来替换C#方法的lua function;

++++立钻哥哥:示例参考:

xlua.hotfix(CS.BaseTest, Foo, function(self, p)

    print(BaseTest, p)

    base(self) : Foo(p)

end)

 

++2.3.4、标识要热更新的类型

++++立钻哥哥:和其它配置一样,有两种方式。

++++方式一:直接在类里头打Hotfix标签(不推荐)。

++++方式二:在一个static类的static字段或者属性里头配置一个列表。属性可以用于实现的比较复杂的配置,比如根据Namespace做白名单。

//立钻哥哥:如果涉及到Assembly-CSharp.dll之外的其他dll(需要放到Editor目录)

public static class YanlzHotfixCfg{

    [Hotfix]

    public static List<Type> by_field = new List<Type>(){

        typeof(HotFixSubClass),

        typeof(GenericClass<>),

    };

 

    [Hotfix]

    public static List<Type> by_property{

        get{

            return (from type in Assembly.Load(Assembly-CSharp).GetTypes()

                       where type.Namespace == XXXX

                       select type).ToList();

        }

    }

}    //立钻哥哥:public static class YanlzHotfixCfg

 

++2.3.5、Hotfix Flag

++++立钻哥哥:Hotfix标签可以设置一些标志位对生成代码及插桩定制化。

++++Hotfix标签:Stateless、Stateful;ValueTypeBoxing;IgnoreProperty;IgnoreNotPublic;Inline;IntKey;

++++【Stateless、Stateful】:遗留设置,Stateful方式在新版本已经删除,因为这种方式可以用xlua.util.state接口达到类似的效果。(由于没有Statefull,默认就是Stateless,所以也没有必要设置该标志位。)

++++【ValueTypeBoxing】:值类型的适配delegate会收敛到object,好处是代码量更少,不好的值类型会产生boxing及gc,适用于对text段敏感的业务。

++++【IgnoreProperty】:不对属性注入及生成适配代码,一般而言,大多数属性的实现都很简单,出错几率比较小,建议不注入。

++++【Inline】:不生成适配delegate,直接在函数体注入处理代码。

++++【IntKey】:不生成静态字段,而是把所有注入点放到一个数组集中管理。

 

++2.3.6、使用建议

++++立钻哥哥:对所有较大可能变动的类型加上[Hotfix]标识。

++++建议用反射找出所有函数的参数、字段、属性、事件涉及的delegate类型,标注[CSharpCallLua]

++++业务代码、引擎API、系统API,需要在Lua补丁里头高性能访问的类型,加上[LuaCallCSharp]

++++引擎API、系统API可能被代码剪裁掉(C#无引用的地方都会被剪裁),如果觉得可能会新增C#代码之外的API调用,这些API所在的类型要么加上[LuaCallCSharp],要么加


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
在C++项目中引入Lua(AlphaGo使用的方案)发布时间:2022-07-22
下一篇:
Lua C API 遍历 table发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap