假设已经将模型和动作导入工程了,这里利用官方模板项目的动作作为例子讲解,只演示待机、跑步的掌握逻辑,跳跃的可以看项目模板的动画蓝图。
1,准备好动作和模型
2,新建一个Blend Space 1D
然后在跳出的菜单中选择骨骼
3,打开Blend Space 1D蓝图,分别将待机、行走、跑步三个动作拖拽到下方面板钟
修正驱动属性名为Speed,默认为None,这个属性名为是后面编辑动画蓝图利用的属性名。
终极效果:
4,将TargetWeightInterpolationSpeedPerSec修正为5.0,修正这个值的缘故原由是为了让角色移动时的静止和移动的过度更加自然
5,新建一个动画蓝图(Animation Blueprin):
在弹出的菜单钟选择父类和骨骼,父类为:AnimInstance;骨骼便是当前模型的骨骼
6,打开动画蓝图的EventGraph面板
然后再添加一个float属性,名字为Speed,表示角色的即时速率
然后再编辑事宜:Event Blueprint Update Animation
7,打开AnimGraph面板
新建一个State Machine
双击State Machine,进入里面编辑。从Entry节点钟拖拽并新建一个State:
将该State命名为Idel/Run
然后双击该State,进入里面编辑:个中Speed,便是之前新建float属性
末了再返回到最外层的AnimGraph面板,将StateMachine链接到Final Animation Pose上
8,新建角色蓝图Character Blueprint:
父类选择工程中的C++ Character class:
然后打开角色蓝图,选中mesh
将Anim Class指定为之前创建的动画蓝图:
将Skeletal Mesh指定为模型的骨骼:
如果默认的骨骼基准坐标、转向和刚体大小、MovementComponent的默认方向不匹配,则须要编辑下Mesh的Transform
9,到此,动画蓝图和角色蓝图编辑完成,可以在C++中利用刚刚新建的角色蓝图。
ATopDownTestGameMode::ATopDownTestGameMode(){ // use our custom PlayerController class PlayerControllerClass = ATopDownTestPlayerController::StaticClass(); // set default pawn class to our Blueprinted character static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT(\"大众/Game/TopDownCPP/Blueprints/NewBlueprint\"大众)); if (PlayerPawnBPClass.Class != NULL) { DefaultPawnClass = PlayerPawnBPClass.Class; }}
补充:播放Montage的Slot问题
播放montage动画时,可能碰着播放动画没有反应的问题,例如,用C++的办法播放:
float ACharacter::PlayAnimMontage(class UAnimMontage AnimMontage, float InPlayRate, FName StartSectionName)
缘故原由:
可能时没有指定Montage的Slot
办理办法:
1,打开Montage动画,看下默认的Slot名字叫什么
2,然后在动画蓝图钟的AnimGraph中,拉出一个Slot节点
然后在从该Slot中连接到Final Animation Pose中:
如果想修正该Slot节点的Slot名字,可以在属性面板中修正:
如何在C++代码中指定Montage的Slot名字,还没研究过。但是可以通过AnimSequence动态创建一个Montage工具,并指定Slot名字:
USkeletalMeshComponent Mesh = MyActor->FindComponentByClass<USkeletalMeshComponent>();if (Mesh){ UAnimInstance AnimInst = Mesh->GetAnimInstance(); if (AnimInst) { UAnimMontage Mtg = AnimInst->PlaySlotAnimationAsDynamicMontage(MyAnimSequence, TEXT(\"大众MySlotName\"大众), 0.1f, 0.1f, 1.0f, 30.0f); }