ideajava目录显示类成员_基于脚本的游戏对象系统(2)统一原生类和脚本类

1ee2e2d9aa2280c040dab0e6110e23fd.png

前置说明:这是 2016 年 CreateXEngine 2 时使用 c++ 和 lua + QT 实现了一套高仿 UE4 蓝图编辑器,整个编辑器逻辑本身也是用 lua 编写,可直接生成 lua 脚本执行。

前一段时间的开发主要是针对游戏逻辑中的脚本类,包括类成员(变量、函数、事件、宏、函数事件宏的局部变量和输入输出参数)的管理(增、删、改)以及修改成员的各项属性等。还包括了创建脚本节点以及节点链接这些基本操作,以及根据脚本类定义和节点生成真正的脚本代码。
最近完成了在预置编辑器中修改类成员时的同步功能,主要同步的对象有3种:1.所有此类的实例化对象。2.所有此类的派生类的实例化对象。3.所有使用此类做为组件的对象。 同步规则:当上述三种对象的属性值和当前类的属性值相同时进行同步。同步时如果对象在 Inspector 面板(预置编辑器或者关卡编辑器)时将会实时显示同步后的值。当以下事件发生时触发同步:改变父类、名称修改、类型修改、默认值修改、修改组件以及编译或保存 Prefab。

同步功能主要通过 ObjectProxy 完成,ObjectProxy 中封装了对真正的脚本对象的访问操作,同时也带有一些对象的额外的描述信息,比如属性的设置和获取函数列表、属性顺序表、生成设置属性值代码功能(生成脚本代码时使用)、比较两个 Proxy 的属性值是否相同(生成代码、同步对象时使用)等功能。ObjectProxy 还用于在 Inspector 上显示对象属性信息,同时借助 lua 的 __newIndex 机制实现了 UI 和对象之间的数据双向数据同步,这样就不必为每种类型的对象编写显示和设置属性的代码,实现了所有对象的统一 Inspect 功能。

在 ObjectProxy 内部,实现了对原生类对象的封装,在初期的版本中使用和脚本类完全不同的机制支持原生对象,但始终觉得过于麻烦,决定使用和脚本类统一的方式来处理原生类对象,使用定义脚本类的方式定义原生类。
为了实现这一点,需要原生类提供以下支持及限制:
1. 所有对原生类的成员变量的读写只能通过函数方式访问,类似于java,定义SetXXXGetXXX,如果两者都有是读写,否则是只读或者只写。
2. 原生类属性的定义,有两种方式:
a) 在编辑器中定义原生类的属性和属性访问函数,不生成代码,只定义接口。成员变量名称必须要有对应原生类的Set***Get*** 函数,比如Name 成员变量,原生类中必须要有SetNameGetName 函数。由于实际生成代码并不使用原生类的成员变量,所以原生类定义中的成员变量不必和原生类成员变量名相同。
b) 直接在C++中定义成员变量,并设置为public,不需要定义SetXXXGetXXX函数。然后在类编辑器中定义同名同类型的成员变量即可。
上述两种方法都可以实现原生类属性的定义,区别在于第一种可以实现间接或者复杂的访问原生属性的逻辑,这些逻辑可在C++层次中完成,而不需要通过脚本代码定义。第二种用于简单直接的访问原生类属性。

3. 原生类函数的定义,按照C++函数原型在脚本类中定义函数即可。
通过上述方式,实现了脚本类和原生类的统一处理和访问,对于原生类的使用(继承、成员访问、Inspect、实例化、序列化等)和脚本类完全相同,对于游戏逻辑,甚至无需知道当前的对象是否原生,从使用的角度来看,二者是完全相同的。创建脚本类,可选择原生类或者脚本类做为父类,当创建原生类时,只能选择原生父类。

d8182a3dcf8673b37ef9367d429feaa8.png

增加组件时,可选择原生类组件或者脚本类组件

27b0b9db4039b0fa62a1c744c1a59feb.png

在预置编辑器中定义原生类:空间变换组件 CxTransformComponent

2f578639f7d5ef58f5f6361110ff8f1c.png

在预置可视化脚本编辑器中可直接访问原生类及其成员,如同访问脚本类一样。

c16b7e83c95d8a94fc1f5f4baeb9f781.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值