# 基础架构

在上一个课程我们已经学习了预设和零件的一些简单用法,并轻松制作出了一个炫酷的功能玩法。

这个课程将逐步为你介绍一些更深入的知识,包括预设系统的构成、各种内置预设以及如何使用预设编辑器组装各种炫酷的预设等。

# 构成

预设系统的基础数据结构体系如下图:

image-PresetFramework20220209

前两层是基础数据类型,从第三层开始着重介绍,PresetBase、PartBase、BoxData是组装自定义预设/零件的基础结构,

EntityObject、PlayerObject、EffectObject是对SdkInterface(SDK接口封装基类)的另一层封装,构建对不同种类预设对象的抽象,以接口的形式对外直接提供组件操作;

XXXPreset相关都是一些内置预设,是预设体系与我的世界游戏元素的结合。

预设系统的目标是进一步降低我的世界开发者的使用门槛,通过简单的组装,修改自定义预设,更方便的架设自己的新世界。

# 基础数据类型

  • GameObject

    GameObject(游戏对象)是所有预设对象的基类,实现了序列化,存档,读取等功能。

  • SdkInterface

    SdkInterface(SDK接口封装基类)是对SDK接口封装的基类,将组件的操作以方法的形式暴露出来,外界直接调用即可,不必再走先创建对应组件再调用组件相关方法的步骤。

  • TransformObject

    TransformObject(变换对象)是拥有坐标变换属性的的游戏对象基类,包括位置变换、旋转变换、缩放变换等,是拥有确定位置信息数据的一类对象。

  • PresetBase

    PresetBase(预设基类)是所有预设的基类。预设是一类可以被直接放置在场景中的TransformObject(变换对象),并且预设下可以挂接其他TransformObject,可以通过这种方式对游戏逻辑进行简单的封装。

    在编辑器中放置预设时,会生成预设的虚拟实例,在游戏中生成预设,会生成真实实例。

    它也可以直接理解为空预设,实现了挂接子节点,属性修改,实例化,加载卸载与驱动自定义零件逻辑等功能。

  • PartBase

    PartBase(零件基类)是所有自定义零件的基类。将零件挂接在预设下,可以为预设赋予特定的逻辑和功能。

    设计零件的初衷是为预设提供一些即插即用的代码型功能组件。

    通过良好的设计,预设系统的大部分功能都可以通过自定义零件实现。

    零件本身放进MOD里并不会生效,必须挂接到某个预设身上,并让这个预设在游戏中实例化才能生效。

  • BoxData

    BoxData(素材数据)与素材类似,可以挂接在预设下使用。

    素材在编辑器中不会实际生成,而是虚拟实例化,可以重叠放置。

    在虚拟实例化状态,素材的变换可以任意调整并进行预览。

    只要运行一次,素材就会真实实例化,永久变成地图的一部分。

    真实实例化后,素材不会因预设卸载或调用坐标变换相关API而发生变化,也不会因重启地图而重新加载,直至销毁。

    销毁素材时,会尝试将素材数据内未发生过变化的方块替换为空气,部分特殊方块可能无法清除。

  • EntityObject

    EntityObject(实体对象)是对实体公共SDK组件使用的封装,为外层实体预设提供了面向实体对象的组件操作方式,将底层SDK接口另外做了一层封装,向开发者提供更加便捷的SDK组件调用方式;

    开发者无需再走先创建对应组件再调用组件方法的流程,可直接调用对外提供的组件方法,提高了开发者的开发效率。

  • PlayerObject

    PlayerObject(玩家对象)是对玩家相关SDK组件使用的封装,为外层玩家实体预设提供了面向玩家对象相关的组件操作方法,与实体对象的差异在于,其只封装了与玩家对象相关的sdk方法。

  • EffectObject

    EffectPreset(特效预设)是一类绑定特效资源的预设,设计思路与上述所述(实体对象)设计思路一致,为外层特效实体预设提供了面向特效对象相关的组件操作方法。