在基于lua进行热更新的项目中,咱们一般会经过luaBehaviour来让lua文件模拟MonoBehaviour,可让lua文件拥有一些MonoBehaviour的生命周期,如Enable、Disable、Update。
同时能够注入一些UnityEngine.Object。在lua中方便的调用Unity中的对象。方便开发者进行开发。
本文进行介绍的luaBehaviour就是基于这个思路设计的,除了上面提到的特性以外还经过Json支持了更多类型的注入,Editor界面更人性化的展现,整个开发过程更接近MonoBehaviour的开发体验。git
1.新建继承LuaBehaviour的lua文件,经过AddDefineList添加须要序列化的信息。
2.直接把这个lua文件拖到CS中的LuaBehaviour上便可。
接下来能够像MonoBehaviour同样对数据进行编辑了。
github
luaBehaviour在使用的时候通常是经过记录名字或路径的方式来序列化lua文件的的。打包后经过这个路径从AssetBundle中进行lua文件的加载(这个是lua脚本热更新经常使用的策略,在这边就很少说了)。
这里仍是经过路径来记录lua文件,可是不须要手动输入,而是经过直接拖动的方式间接记录lua文件路径。函数
不经过C#侧定义注册信息,而是经过在Lua中先定义好要注册的类型和名称(更符合MonoBehaviour的开发姿式)。开发时,Editor读取lua中定义的类型和名称信息,展现在Inspector中,供开发者编辑。
在运行时再将序列化的数据注入到lua实例中。工具
这种类型没啥特别的,在LuaBehaviour脚本中定义一个记录key和UnityEngine.Object的List便可。测试
非UnityEngine.Object类型就没有一个统一的格式,没法经过一个列表简单的进行记录。可是咱们查看Prefab的实例能够发现,Prefab序列化的数据其实和Json很像。对在MonoBehaviour中定义的各个字段的序列化姿式也和Json很像。
因此这里考虑使用Json来序列化非UnityEngine.Object类型的对象。恰好Unity由提供了一套简单高效的Json工具JsonUtility。JsonUtility内部就是经过Unity serializer实现的,因此稳定性颇有保证。
可是JsonUtility有个缺点,只能序列化一部分类型,不能序列化如Int、List这种类型。
为了解决这个问题。这里在序列化的时候经过泛型为每一个类型生成一个Wrap类型。便可通用的实现各类类型的序列化。
ui
也没啥好说的,直接根据key向Lua实例中Set便可。lua
先实例化为Wrap对象,而后再取出其中的须要注入的对象,Set到Lua对象中便可。设计
UnityEngine.Object类型统一使用EditorGUILayout.ObjectField绘制便可。对象
由于没有找到一个通用的能够表现全部对象的绘制方式,因此这里也作了一个转换。先经过Emit生成一个继承自ScriptableObject的类(由于ScriptableObject是UntiyEngine.Object,因此可使用SerializedObject来绘制。同时能够直接经过ScriptableObject.CreateInstance进行实例的建立)。把须要绘制的对象放到这个类里面,而后经过EditorGUILayout.PropertyField绘制便可。blog
这里把Update、FixedUpdate等高频或者不多使用的函数拆分出去,只有在Lua中定义了这些函数,才添加对应的Assistant脚本对这些函数进行调用。
Enable、Disable、Destroy这三个经常使用函数,就直接放在LuaBehaviour脚本中进行调用。