概述

阅读本文档,您可以了解如何如何在Unreal Engine4中使用Creature运行库。该运行库使用C++语言。我们将通过一个示例来说明如何加载导出的JSON文件并在场景中进行播放。

在Unreal Engine中使用Creature,基础

视频教程

Unreal

点击 这里观看CreatureUnreal Engine集成的概述。本教程使用新的CreatureUnreal Engine4(UE4)插件展示Creature网格组件框架以及一些用于切换动画状态的蓝图功能。如果您之前不熟悉Creature UE4插件,请观看此视频教程

Unreal

点击 这里观看视频,深入了解以下功能用法:Creature运行库插件、蓝图功能切换动画集合、集合碰撞器对象跟随角色骨骼。

Unreal

点击 这里观看视频,深入了解如何将一个完整的龙角色与多个动画带入到UE4,并驱动使用蓝图的可视脚本系统和Creature UE4插件

Unreal

点击 这里观看视频,了解如何在Mac上设置Creature插件

Unreal

点击 这里观看视频,了解如何进行运行库图像区域交换,及如何在您的游戏中使用锚点

Unreal

点击 这里观看视频,了解如何使用Live 2骨骼反向动作造型功能。

Unreal

点击 这里观看如何播放从Creature导出的含动画网格区域顺序的角色。

Unreal

点击 这里 观看如何使用UE4中的样条线组件创建路径,然后将其导入Creature以用作角色运动路径

Unreal

点击 这里观看如何使用Creature中的蒸馏机(Alembic)导出选项,将您的角色导出为Alembic文件并在UE4中使用。

Unreal

点击 这里观看如何使用Creature插件中的帧回调触发器功能为角色特定动画帧中的粒子的足迹和生成激活有用的事件。

Unreal

点击 这里观看如何使用Creature工具自带的新事件创作编辑器创作框架回调触发器的教程。导出的事件触发器可以从UE4加载。作为前面教程的补充,本教程介绍了如何不使用UE4,在Creatue编辑器中进行事件创作。

获取运行库

您可以直接从Creature游戏运行库窗口下载运行库,或点击 这里从版本库获取运行库。要获取您的自定义引擎,您需要获取包含核心Creature运行库库文件的UE4运行库。

在Unreal Engine中播放Creature动画的不同方法

方法1

  1. 在UE4项目目录中创建一个插件(Plugins)文件夹;

2)从github版本库进入Creature_UE4 / CreatureEditorAndPlugin; 将CreaturePlugin目录复制到您的游戏项目的插件目录;

4)右键单击您的.proroject文件并生成虚幻项目文件以更新您的Visual Studio项目。

5)在Visual Studio中编译并运行项目。

方法2

如只需处理骨骼动作动画,您只需将您的角色导出为FBX或Alembic格式,并将它们作为常规FBX或Alembic动画导入Unreal Engine。

如何使用UE4 Creature运行库

在UE4中,您可以使用通过两种方式使用Creature运行库:

1)作为Creature网格组件。您可以创建一个空白参与者对象,并从中添加一个Creature网格组件进行播放;

2)您可以创建一个Creature参与者对象,并使用它进行播放。

使用UE4 Creature运行库作为Creature网格组件

该方式为使用UE4 Creature运行库的新方式。所涉及的概念与Creature参与者的用法非常相似。请阅读Creature参与者的用法了解更多信息。

本节介绍了如何设置Creator动画播放的空白参与者:

1)创建一个空白参与者

2)将其转换为蓝图对象;

3)打开蓝图编辑器,点击添加组件

4)在蓝图中添加一个Creature网格组件对象;

5)到此,操作完成。Creature网格组件的控制与Creature参与者相同,因此请您阅读Creature参与者部分以获取更多信息。

Creature网格组件和集合剪辑

使用集合剪辑,本质上您可以在不同的导出JSON文件中播放多个动画作为一个巨大的剪辑。

因而,您可以将动画与不同的绑骨和纹理组合,使其成为一种非常强大的工具,并用于需要不同绑骨的角色代表的情况。如需了解更多有关集合剪辑及其背后概念的信息,请您阅读组合多个角色动画部分。

以下是使用集合剪辑的步骤:

1)在您的资源面板中:点击右键→其它→Creature动画资源

2)在弹出窗口上选择您的json文件;

3)使用创建的Creature动画资源,将角色的材质拖动到材质集合槽中。

您创建的Creature动画资源数量应与您要组合的json文件的数量相同。

下一步:

1)再次点击右键→Creature→Creature动画剪辑存储

2)双击Creature动画剪辑存储,打开一个新面板;

3)开始填充剪辑列表数组。

填充剪辑列表数组:

1)点击+号,添加一个新的元素;

2)为您的组合剪辑命名一个新的剪辑名称,如:MyCombinedClip

3)在镜头剪辑列表数组中,开始添加您要撰写的剪辑的实际组合。

填充镜头剪辑列表数组:

1)点击+号,添加一个新条目;

2)选择源资源。这些是您之前创建的Creature动画资源

3)填写该条目的实际动画名称。该名称为json文件中动画剪辑的实际名称。

在拍摄剪辑列表中添加条目的数量,应与您需要撰写的数量相同。

最后,在蓝图编辑器中,选中启用集合剪辑以启用集合剪辑功能。您可以通过调用设置蓝图活动集合剪辑函数来确定要播放的集合剪辑。

组合使用Creature网格组件与新的Creature资源

您可以将Creature网格组件Creature资源结合使用,这是一种将动画加载到运行库的新方式。

创建一个Creature资源

1)在内容浏览器中点击右键;

2)转到杂项(Misc)→Creature动画资源,创建资源;

3)选择导出的Creature JSON文件

通过以上步骤,即可在UE4中创建新的Creature资源。然后进入Creature网格组件,将Creature动画资源插槽指向新创建的资源,即可完成该加载。

使用UE4 Creature运行库作为一个Creature参与者

UE4 Creature运行库背后的主要概念围绕着ACreatureActor类。该类即为您添加到您的UE4场景以播放Creature动画的类。

请查看ACreatureActor的标头文件并注意以下属性/函数:

基础属性

  • creature文件名:该属性为您在编辑器中设置的字符串,其指向Creature角色的JSON文件;

  • 动画速度:该属性确定游戏运行时动画播放的速度。默认值为1.0,即正常速度;要使动画播放速度为正常速度的两倍,请将该值设置为2.0;

  • 开始动画名称:开始播放时首先播放的动画的名称;

  • 平滑过渡:该属性设置为true时,将使用蓝图函数SetBluePrintBlendActiveAnimation。如将此属性设置为True,您必须使用SetBluePrintBlendActiveAnimation()设置动画;

  • 骨骼数据长度因子:该属性应与GetBluePrintBoneXform函数结合使用。它为您连接的骨骼碰撞器缩放输出变换,改变它们的长度。通过该属性可以调节您的骨骼碰撞器,使之适应您的角色的骨架;

  • 骨骼数据尺寸:该属性应与GetBluePrintBoneXform函数结合使用。它为您连接的骨骼碰撞器缩放输出变换,改变它们的高度。通过该属性可以调节您的骨骼碰撞器,使之适应您的角色的骨架;

  • 区域覆盖深度增量:该属性可以将深度偏移值添加到角色的每个区域/图层。因为您正在3D引擎中创作2D资源,所以该属性必需存在。您绑骨中的每个新区域都要添加该深度增量值。建议您为该变量设置较小的正值或负值(0.01或-0.01)。您可以根据摄像机的位置或角色的朝向,为该变量选择正值或负值。例如,若角色朝向从左向右切换(一般是180度旋转),您就必须翻转或将此值设为负值,以确保图层/区域以正确的顺序渲染;

  • 动画帧:此变量可以返回播放动画的当前动画帧。

调试绘图问题

您的角色是否会无故消失?您的角色动画播放有问题?请尝试对以下变量进行一些调试:

  • Creature调试绘图:该变量可以渲染出您的角色的线框图的包围球体;

  • Creature包围缩放:该变量可以缩放您的角色的包围球体;请将将此值设置为一个较大的值,以避免角色被渲染引擎剔除;

  • Creature包围偏移:由于在管道设置了双重变换,包围球体因各种原因不以您的角色为中心时,您可以输入一个矢量值偏移包围球体。

最后,进入设置→渲染并关闭遮挡剔除。

动画函数

  • **Set BluePrintActiveAnimation(AnimationName)**:该函数是一个可以使用给定的动画名称调用的蓝图函数。调用该函数将导致角色以给定名称切换到新动画;

  • **Set BluePrintBlendActiveAnimation(AnimationName, Delta)**:该函数是一个可以使用给定的动画名称调用的蓝图函数。调用该函数将导致角色在平滑过渡中以给定名称切换到新动画。第二个参数确定了当前动画过渡到下一个动画的速度。请设置:0 <增量值<1;

  • **Set BluePrintAnimationCustomTimeRange(AnimationName, startTime, endTime)**:该函数是一个蓝图函数,用于自定义动画剪辑的开始和结束时间;

  • **Set BluePrintAnimationLoop(flag)**:该函数将打开/关闭动画循环;

  • **SetBluePrintAnimationPlay(flag)**:该函数将启动/停止动画;

  • **GetBluePrintAnimationFrame()**:该函数将返回当前动画帧;

  • **SetBluePrintAnimationResetToStart()**:该函数将动画重置为开始帧;

  • **SetBluePrintAnimationPlayFromStart()**:该函数将从开始帧播放动画;

  • **SetBluePrintRegionAlpha(FString regionnamein, uint8 alpha_in)**:该函数将设置给定名称的区域的alpha/不透明度值;

  • void SetBluePrintRegionCustomOrder(TArray order_in):使用该函数您可以重新排序角色的区域。您需要提供一个包含所有区域名称但在自定义顺序中排序的输入数组字符串。确保该数组的大小与您在角色中具有的区域的总数相同。

动画事件

  • **BlueprintAnimationStart(frame)**:该事件是一个可以覆盖的蓝图事件。该事件在动画开始时触发;

  • **BlueprintAnimationEnd(frame)**:该事件是一个可以覆盖的蓝图事件。该事件在动画完成时触发。

自定义动画帧回调事件触发器

您可以创建和触发自定义帧回调事件用于角色声音效果,如脚步或动画的特定帧中的粒子任务。

该设置非常简单,您可以使用两类回调:

  • Creature帧回调:使用该回调,您可以在动画中的特定帧处触发回调;

  • Creature重复帧回调:该回调是一个重复的回调,它能够以给定的偏移值重复每个指定的X帧。

以下是创建常规帧回调的蓝图布局:

UE4

通过上图您可以看到,该布局涉及使用Creature帧回调结构数组调用SetBluePrintFrameCallbacks函数。请您注意为数组中的每个结构体填写正确的细节。

类似地,重复回调触发设置如下:

UE4

回调被设置后,您的游戏代码仅能获知回调委托:

UE4

您还应该让游戏代码获知委托中输入的名称参数。您可以使用名称参数来解析并确定在触发回调时,应如何以及以何种行为运行。

使用Creature编辑器自定义动画帧回调事件触发器

现在您可以直接在Creature编辑器中创建事件,并将它们导出到引擎中。

  1. 首先,打开在Creature的事件触发器编辑窗口: UE4

  2. 添加您的自定义事件。事件将添加在动画的当前时间/帧: UE4

  3. 导出您的角色并导入**.mdata Creature元资源**到场景中。本文档的“动画区域排序”部分介绍了该部分。

  4. 将Creature网格组件指向新的Creature元资源

  5. 在**EventBeginPlay()中,调用LoadBlueprintFramCallBacksAsset()**加载您创作的事件。

连接上一节中记录的所需回调委托以正常运行。

骨骼内省和碰撞

  • **GetBluePrintBoneXform(boneName, doWorldTransform)**:该函数是一个蓝图函数,使用该函数返回角色中骨骼的变换。切换doWorldTransform标志将返回世界空间中的位置。返回数据为FTransform形式。您可以使用它来放置一个碰撞器对象。

步骤 3.1:ACreatureActor对象

第一步是将ACreatureActor对象添加到场景中。下面列出的是材料组中该对象的属性:

UE4

Creature文件名称设置为角色JSON文件的路径;将开始动画名称设置为要播放的开始动画剪辑;将动画速度设置为不同的值,以确定动画播放的速度;如需在动画切换时使用平滑过渡,请开启平滑过渡属性;

最后,请您为角色的纹理设置合适的材质,以便在屏幕上正确显示角色。

步骤 3.2:在蓝图中切换动画

UE4

ACreatureActor对象有暴露(expose)给蓝图系统的方法。特别值得关注的是函数**SetBluePrintBlendActiveAnimation(AnimationName, Delta)**。使用该函数,您可以在动画剪辑之间平滑过渡角色。

该系统使用方法非常简单。您只需将引用了您的角色的函数添加到蓝图。然后设置以下内容:

  • 名称输入:要切换到的动画剪辑的名称;
  • 系数:当前动画混合到目标动画的速度(0 <系数值 <1)。

将该功能的exec插槽连接到游戏性逻辑的其余部分,并观察您的角色更改动画状态。

步骤3.3 交换游戏项目/区域

您可以使用运行库切换角色的特定网格区域。该功能非常实用,您可以用它执行角色项目(如帽子、鞋子和武器)的切换。

切换准备

1)确保在Creature编辑器中为要交换的区域启用启用图像交换

2)确保您有一个单个图像交换结点可以在子画面帧管理器设置感兴趣的区域;

3)打开子画面帧管理器,记下要在该区域交换的其它子画面的标签值:

UE4

该标签值始终为负值。稍后您可在游戏项目交换中将该值放入运行库。

运行时

UE4

从上一节中的标签调用SetBluePrintRegionItemSwap函数。触发该功能时,区域网格将与对应期望标签值的新图像交换图像。

步骤3.4 组合多个角色动画

Creature集合参与者是一个参与者对象。使用该对象,您可以将一组Creature参与者串在一起,并依次播放它们的动画,如同播放单个动画剪辑的一部分。

该功能非常实用。如果您有两个或更多不同的绑骨代表同一个角色,并希望能像播放单个合并动画剪辑一样,将这两个不同的动画连续播放,您可以使用该功能。

使用方法

1)创建要操控的单个Creature参与者;

2)创建一个Creature集合参与者,然后在该Creature集合参与者下放置需要的Creature参与者。该操作是为了使子代参与者根据父代Creature集合参与者进行变换。

UE4

3)开始构建您的集合剪辑:集合剪辑由一系列(Creature参与者,Creature参与者动画剪辑)对组成。基本上就是您说的,“我想添加这个参与者先播放这个剪辑,然后那个参与者播放那个剪辑……”

集合剪辑本身被赋予一个名称。该名称是用于表示该动画剪辑集合来自不同参与者。

下图中正在创建一个名为“剪辑1”的新集合剪辑。添加第一个子代1参与者及其动画Cyclops_IDLE到“剪辑1”,然后添加第二个子代2参与者及其动画Cyclops_HIT_1到“剪辑2”;

UE4

4)开始实际播放您的新集合剪辑,系统将视其为一个大的动画剪辑!正常剪辑可以设置蓝图函数(如:SetBluePrintActiveClip),您可以用其在已编辑的剪辑之间进行切换。还有一些事件,如Creature动画结束事件,会在集合剪辑完成播放时触发:

UE4

步骤3.5 锚点

通常,在为角色制作动画时,您可能不会把它们在同一原点。使用锚点,您可以指定角色的相对原点给特定的动画剪辑。如果需要,您可以使用该功能将不同的角色动画居中。

1)在Creature编辑器中,运行动画→设置锚点

2)拖动角色周围的红色旋转框,以设置锚点UE4

  1. 在UE4中:

UE4

通过调用SetBluePrintUseAnchorPointstrue激活锚点函数。

步骤3.6 游戏实时IK

通过在UE4中设置IK约束,您可以在您角色的2个骨骼上实时运行IK。

下图是参考蓝图:

UE4

1)创建一个Creature骨骼反向结构。该结构具有以下属性:

  • 第一骨骼名称:您的IK系统的第一骨骼的名称;

  • 第二骨骼名称:您的IK系统的第二骨骼的名称;

  • 目标位置:在世界空间中构建2个骨骼的目标位置;

  • 正角:无论IK系统指定正角度还是负角度。

2)使用在上一步中创建的Creature骨骼反向结构调用函数SetBlueprintBonesIKConstraint。在事件触发期间调用此函数将在游戏中实时更新骨骼到目标位置。

要删除您的ik约束,只需调用RemoveBlueprintBonesIKConstraint

步骤3.7 游戏实时进行骨骼位置覆盖

您可以通过以下设置在游戏中实时覆盖骨骼的位置:

UE4

1)创建一个Creature骨骼覆盖结构。该结构具有以下属性:

  • 骨骼名称:骨骼的名称;

  • 起始位置:世界空间中骨骼的起始位置;

  • 结束位置:世界空间中骨骼的结束位置。

2)创建一个新数组,并连接该数组与上一步中创建的骨头覆盖结构。

3)使用在步骤2中创建的数组调用函数SetBlueprintBonesOverride

动画区域顺序

在Creature中使用动画区域排序创作您的角色,会生成一个新文件。该文件的扩展名为**.mdata。创建一个Creature元资源,然后将新资源指向.mdata文件。然后,进入蓝图参与者的Creature网格组件并将Creature元资源**槽指向新创建的资源。上述操作将激活您的角色的动画区域排序。

高级用户:了解核心Creature运行库程序库

以上内容描述了Creature UE4运行库的使用。有时候您可能需要修改或向核心Creature静态运行库程序库添加其它功能。以下内容深入描述了静态运行库程序库如何工作。

请您关注以下文件:

MeshBone.cpp & MeshBone.h:Creature运行库的占用引擎。您可以在此访问整个骨架层次结构、其对应的骨骼以及网格区域。

CreatureModule.cpp & CreatureModule.h:负责管理Creature角色并构造加载到动画文件中的角色的层。

请注意:UE4 ACreatureActor类调用了CreatureModule,以播放Creature动画。

加载和初始化

假设已导出一个名为dragonTest.json的龙动画文件,及其相应的纹理图谱character-dragon.png

首先加载文件资源:

CreatureModule::CreatureLoadDataPacket json_data;
CreatureModule::LoadCreatureJSONData(filename, json_data);

上述操作将从磁盘加载JSON数据并进入内存。然后,创建可以使用这些加载的资源的实际对象:

auto cur_creature = std::shared_ptr<CreatureModule::Creature>(new CreatureModule::Creature(json_data));

creature_manager = new CreatureModule::CreatureManager(cur_creature);
creature_manager->CreateAnimation(json_data, "default");
creature_manager->CreateAnimation(json_data, "second");    

在上述示例中,JSON文件有2个动画剪辑:默认剪辑和第二剪辑。因此,您需要从Creature管理器对象创建2个动画,使它们可以播放。

已完成加载,可以设置活动状态的动画用于播放:

creature_manager->SetActiveAnimationName("default");

上述操作将默认剪辑设置为当前活动的动画。在ACreatureActor中查看LoadAnimation(),AddLoadedAnimationLoadCreature,您可以注意到,它们精确执行上述步骤,以设置角色播放。

Creature管理器和Creature类

为了在您的引擎中播放和显示Creature角色,您需要访问播放姿势机制以及最终Creature角色网格的拓扑、点和纹理坐标。

  • Creature管理器:管理动画和加载角色的类。您可以使用该类,以一定的时间增量推进动画。您的游戏循环或渲染器应在每个“游戏刻度”与该类的更新函数进行交互。

  • Creature:包含加载Creature的类。可以从Creature管理器访问该类。此类包含游戏引擎在屏幕上显示所需的所有几何体和渲染数据。

更新和推进动画

每个游戏引擎都有更新/游戏刻度调用。在这种情况下,我们运行:

void ACreatureActor::Tick(float DeltaTime)
{
	if (creature_manager)
	{
		creature_manager->Update(DeltaTime * animation_speed);
		UpdateCreatureRender();
	}
}

通过上述操作通知管理器以一定的时间增量更新其Creature角色,即可使动画通过增量值向前推进。

显示网格

Creature对象返回以下内容:指数、贴图坐标和点。这些属性足以渲染出角色网格。具体方法如下:

void ACreatureActor::UpdateCreatureRender()
{
	auto cur_creature = creature_manager->GetCreature();
	int num_triangles = cur_creature->GetTotalNumIndices() / 3;
	glm::uint32 * cur_idx = cur_creature->GetGlobalIndices();
	glm::float32 * cur_pts = cur_creature->GetRenderPts();
	glm::float32 * cur_uvs = cur_creature->GetGlobalUvs();

	TArray<FProceduralMeshTriangle>& write_triangles = mesh->GetProceduralTriangles();

	static const FColor White(255, 255, 255, 255);
	int cur_pt_idx = 0, cur_uv_idx = 0;

	for (int i = 0; i < num_triangles; i++)
	{
		int real_idx_1 = cur_idx[0];
		int real_idx_2 = cur_idx[1];
		int real_idx_3 = cur_idx[2];

		FProceduralMeshTriangle triangle;

		cur_pt_idx = real_idx_1 * 3;
		cur_uv_idx = real_idx_1 * 2;
		triangle.Vertex0.Position.Set(cur_pts[cur_pt_idx], cur_pts[cur_pt_idx + 1], cur_pts[cur_pt_idx + 2]);
		triangle.Vertex0.Color = White;
		triangle.Vertex0.U = cur_uvs[cur_uv_idx];
		triangle.Vertex0.V = cur_uvs[cur_uv_idx + 1];

		cur_pt_idx = real_idx_2 * 3;
		cur_uv_idx = real_idx_2 * 2;
		triangle.Vertex1.Position.Set(cur_pts[cur_pt_idx], cur_pts[cur_pt_idx + 1], cur_pts[cur_pt_idx + 2]);
		triangle.Vertex1.Color = White;
		triangle.Vertex1.U = cur_uvs[cur_uv_idx];
		triangle.Vertex1.V = cur_uvs[cur_uv_idx + 1];

		cur_pt_idx = real_idx_3 * 3;
		cur_uv_idx = real_idx_3 * 2;
		triangle.Vertex2.Position.Set(cur_pts[cur_pt_idx], cur_pts[cur_pt_idx + 1], cur_pts[cur_pt_idx + 2]);
		triangle.Vertex2.Color = White;
		triangle.Vertex2.U = cur_uvs[cur_uv_idx];
		triangle.Vertex2.V = cur_uvs[cur_uv_idx + 1];

		write_triangles[i] = triangle;

		cur_idx += 3;
	}

	mesh->ForceAnUpdate();
} 

通过上述操作您可以看到,所需的动作只是简单地发送点、贴图坐标和指数到您的渲染管道,以及绘制数据作一系列的三角形。

自定义时间/帧范围

您可以为当前活动的动画设置自定义时间/帧范围。假设您想将播放限制在10到20的帧范围内,您可以执行以下操作:

auto all_animations = creature_manager->GetAllAnimations();
all_animations["myAnimation"]->setStartTime(10);
all_animations["myAnimation"]->setEndTime(20);

动画混合

您可以执行以下操作来混合2个动画剪辑:

creature_manager->SetBlending(true);
creature_manager->SetBlendingAnimations("default", "second");
creature_manager->SetBlendingFactor(0.5); // 在混合时,可选数值为从0到1

使用自动混合进行平滑过渡

如需平滑地从一个动画状态过渡到下一个动画状态,您可以在运行库使用自动混合功能。

要启用自动混合,首先:

creature_manager->SetAutoBlending(true);

将所有动画添加到Creature管理器对象后。

要使用自动混合,只需一次调用:

creature_manager->AutoBlendTo(NEW_ANIMATION_NAME, 0.1f);

上述操作将使角色平滑地过渡到名为NEW_ANIMATION_NAME的目标动画。第二个参数确定过渡的时间增量,范围为0.0到1.0。

覆盖、修改骨骼位置

某些情况下,您需要直接修改角色的骨骼位置。例如,为了添加布娃娃物理效果,您可能希望骨骼位置与若干由弹簧或关节连接在一起的刚体保持一致。在这种情况下,您需要为自己的自定义要求设置骨骼位置,您可以执行以下操作。首先,编写自定义骨骼覆盖方法。在下面的例子中,修改了骨骼y方向上的位置:

// 这是一个如何使用回调函数修改您角色中的骨骼位置的示例。
// 在这个例子中,我们将所有的骨骼在y方向上移动一个固定的量。
void
HelloWorld::bonesModifyCallback(std::unordered_map<std::string, meshBone *>& bones_map)
{
    for(auto& bone_data : bones_map)
    {
        auto cur_bone = bone_data.second;
        auto cur_start_pos = cur_bone->getWorldStartPt();
        auto cur_end_pos = cur_bone->getWorldEndPt();
    
        cur_start_pos.y -= 5;
        cur_end_pos.y -= 5;
    
        cur_bone->setWorldStartPt(cur_start_pos);
        cur_bone->setWorldEndPt(cur_end_pos);
    }
}

您还需要告诉Creature管理器使用您的自定义骨骼修改回调,如下所示:

// 如何注册回调函数来修改骨骼的示例
std::function<void (std::unordered_map<std::string, meshBone *>&) > cur_callback =
    std::bind(&HelloWorld::bonesModifyCallback, this, std::placeholders::_1);
creature_manager_2->SetBonesOverrideCallback(cur_callback);

使用点缓存提高播放性能

如果您希望提高动画播放速度,也不想占用引擎资源,您可以在特定的动画上启用点缓存。

点缓存实际上直接存储动画的顶点,可以使播放不必占用引擎。在具有非常复杂的骨架和变形的角色绑骨上使用点缓存将非常高效。

要对特定动画启用点缓存,请执行以下操作:

my_creature_manager->MakePointCache("myAnimationName");

上述即为创建缓存的所有操作。请注意:缓存适用于特定的动画,而不是角色。这就意味着如果您实例化了多个角色,也只需使用该动画的单个缓存。即可节省内存并提升播放性能