模型资源加载

模型资源编辑详见模型编辑器, 本节内容只介绍如何加载资源.


目前为止,引擎为我们创建出了一个虚拟的空荡荡的3D世界。我们接下来的工作则是创建物体,并充满这个3D世界。

在绝大部分的游戏中,我们最为常见的物体是3D模型:

图片源自网络,不像图片一样,3D模型会更加地丰满,拥有更多的细节。

像图片一样,模型也有其对应格式的文件用来保存模型数据,常见的像*.fbx、*.obj、 *.blend等。众所周知,各种客户端的开发框架提供了加载并显示图片的能力,加载*.png、*.jpg可以显示图片。类似地,引擎也提供了加载模型文件来展示一个模型的能力:

  • 一个默认的空旷世界:

  • 添加一个模型:

在引擎中,我们支持的是自定义的*.mdl格式,这个格式是引擎的自定义格式,即只有使用引擎或基于引擎开发的MagicCube编辑器才可以正确加载该模型文件,其它外部软件无法加载该类型文件。相对地,引擎也并不能加载上述的通用模型文件格式。

不过我们在编辑器提供了将通用的fbx文件转换为自定义的mdl格式文件的转换工具。我们可以在编辑器界面,将fbx格式文件拖拽进编辑器的资产面板来进行模型文件的导入转换工作:

现在我们有了一个mdl文件,我们可以着手于把它加载到场景中了。在引擎中,我们使用XEStaticMeshActor来作为模型的载体,(就像我们使用Image控件来显示图片一样)我们使用静态模型Actor来将一个模型文件展示在当前的3D虚拟世界上。

创建这个XEStaticMeshActor的功能,由这个3D的虚拟世界提供,我们亲切地将它的类型定义为XEWorld。在上个教程中,我们创建了一个游戏工程,游戏工程中的Scene.lua文件为我们定义了一个默认的空场景。而这个空场景,就持有了一个3D的虚拟世界,即一个XEWorld类型的变量。我们可以像这样获取到这个world:

    ---@class XEWorld
    local world = scene:GetWorld()

当然了若是在这个scene的成员函数中,我们可以使用self关键字来代替scene,像这样:

function DemoScene:onStart()    --这个Scene的成员函数
    ---@class XEWorld
    local world = self:GetWorld()
end

现在,我们拥有了一个XEWorld类型的world变量,我们可以愉快地进行Actor的创建了。XEWorld提供了使用CreateActor函数来创建Actor的能力。参数为想创建的Actor的类型。就像说到的这样,引擎中不止有用来加载模型的XEStaticMeshActor,还有各种各样类型的Actor,不过在本章中,只会用到加载模型的Actor。

我们如下创建出一个静态模型Actor:

    local actor = world:CreateActor(XEStaticMeshActor.ACTOR_TYPENAME);

其中XEStaticMeshActor.ACTOR_TYPENAME是一个常量字符串,代表了是静态模型类型的Actor。

创建出的actor则已经存在于world当中,如果想删除它,可以调用DeleteActor函数来把它销毁,像这样:

    world:DeleteActor(actor)

在创建了一个Actor之后,我们可以使用GetRootComponent()来获取它的根组件(静态模型组件)。Actor(角色)和Component(组件)的说明可以看下面的Actor、Component和World,简单描述就是Actor是作为世界中的一个角色,而这个角色所特有的功能则由其持有了什么类型的Component所决定。

像静态模型Actor之所以能加载模型文件,是因为它的根组件是一个静态模型类型的Component。在这里,我们直接获取这个组件并使用它来加载模型文件:

    local comp = actor:GetRootComponent()
    comp:LoadAsset(FileUtils:FilePath("res/Asset/test/test.mdl"))

我们使用了一个工具类FileUtils提供带FilePath方法来获取这个模型资源的真实路径。

除了静态模型类型的Actor,引擎还提供了有播放动画能力的动态模型类型的Actor:XEAnimationMeshActor。它的创建和使用与静态模型类型的Actor及其相似:

local actor = world:CreateActor(XEAnimationMeshActor.ACTOR_TYPENAME);
local comp = actor:GetRootComponent();
comp:LoadAsset(FileUtils:FilePath("res/Asset/test/test.mdl"));

和静态模型类型不同的是,动态模型Actor的根组件是XEAnimatableModelComponent类型,该类型的组件提供来为模型播放动画的能力。

我们将在下一节动画播放中介绍如何控制XEAnimationMeshActor播放动画.

@Copyright © cosmos 2019 all right reserved,powered by Gitbook修订时间: 2021-04-12 18:28:17

results matching ""

    No results matching ""