开源软件名称(OpenSource Name):blueberryzzz/LuaBehaviour开源软件地址(OpenSource Url):https://github.com/blueberryzzz/LuaBehaviour开源编程语言(OpenSource Language):C# 97.9%开源软件介绍(OpenSource Introduction):LuaBehaviourInXLuaXLua下支持多种注入类型的LuaBehaviour 简介 在基于lua进行热更新的项目中,我们通常会通过luaBehaviour来让lua文件模拟MonoBehaviour,可以让lua文件拥有一些MonoBehaviour的生命周期,如Enable、Disable、Update。 使用1.新建继承LuaBehaviour的lua文件,通过AddDefineList添加需要序列化的信息。 实现脚本的序列化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很像。 注入的实现UnityEngine.Object类型对象的注入也没啥好说的,直接根据key向Lua实例中Set即可。 其他类型的注入先实例化为Wrap对象,然后再取出其中的需要注入的对象,Set到Lua对象中即可。 Inspector界面中的展示UnityEngine.Object类型对象的展示UnityEngine.Object类型统一使用EditorGUILayout.ObjectField绘制即可。 其他类型的展示因为没有找到一个通用的可以表现所有对象的绘制方式,所以这里也做了一个转换。先通过Emit生成一个继承自ScriptableObject的类(因为ScriptableObject是UntiyEngine.Object,所以可以使用SerializedObject来绘制。同时可以直接通过ScriptableObject.CreateInstance进行实例的创建)。把需要绘制的对象放到这个类里面,然后通过EditorGUILayout.PropertyField绘制即可。 Enable、Update等函数的调用 这里把Update、FixedUpdate等高频或者很少使用的函数拆分出去,只有在Lua中定义了这些函数,才添加对应的Assistant脚本对这些函数进行调用。 Tips
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论