Xlua中LuaBehaviour的实现

简介

  在基于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实例中。工具

序列化的实现

UnityEngine.Object类型对象的序列化

  这种类型没啥特别的,在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

注入的实现

UnityEngine.Object类型对象的注入

  也没啥好说的,直接根据key向Lua实例中Set便可。lua

其余类型的注入

  先实例化为Wrap对象,而后再取出其中的须要注入的对象,Set到Lua对象中便可。设计

Inspector界面中的展现

UnityEngine.Object类型对象的展现

  UnityEngine.Object类型统一使用EditorGUILayout.ObjectField绘制便可。对象

其余类型的展现

  由于没有找到一个通用的能够表现全部对象的绘制方式,因此这里也作了一个转换。先经过Emit生成一个继承自ScriptableObject的类(由于ScriptableObject是UntiyEngine.Object,因此可使用SerializedObject来绘制。同时能够直接经过ScriptableObject.CreateInstance进行实例的建立)。把须要绘制的对象放到这个类里面,而后经过EditorGUILayout.PropertyField绘制便可。blog

Enable、Update等函数的调用

  这里把Update、FixedUpdate等高频或者不多使用的函数拆分出去,只有在Lua中定义了这些函数,才添加对应的Assistant脚本对这些函数进行调用。

  Enable、Disable、Destroy这三个经常使用函数,就直接放在LuaBehaviour脚本中进行调用。

Tips

  1. 这篇文章只起到大体思路和关键点的说明,具体细节能够直接看代码,代码比较少也比较清晰。
  2. 经过Wrap的方式序列化各类对象的方式其实也能够考虑用到一些用户数据在客户端的持久化。
  3. 由于这边主要展现LuaBehanviour的功能,因此AssetBundle的生成和从AssetBundle中加载lua文件都写得很临时,仅做展现用。
  4. 打包测试以前要用AssetBundles->Build AssetBundle For Lua生成一下bundle。

项目连接:https://github.com/blueberryzzz/LuaBehaviour

相关文章
相关标签/搜索