模型资源加载
模型资源编辑详见模型编辑器, 本节内容只介绍如何加载资源.
目前为止,引擎为我们创建出了一个虚拟的空荡荡的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播放动画.