目标:当角色长时间的处于闲置状态时,我希望动画随机过渡到另外的空闲动画资产
1.在动画蓝图,添加Relax状态:

2.Relax状态里:
随机序列播放器,里面设置动画资产,几率是50%:

3.设置过渡规则,但在C++里设置:
Source/Warrior/Public/AnimInstances/Hero/WarriorHeroAnimInstance.h
// Copyright @ ChenChao
#pragma once
#include "CoreMinimal.h"
#include "AnimInstances/WarriorCharacterAnimInstance.h"
#include "WarriorHeroAnimInstance.generated.h"
class AWarriorHeroCharacter;
/**
*
*/
UCLASS()
class WARRIOR_API UWarriorHeroAnimInstance : public UWarriorCharacterAnimInstance
{
GENERATED_BODY()
public:
//原生初始化动画
virtual void NativeInitializeAnimation() override;
//原生线程安全更新动画
virtual void NativeThreadSafeUpdateAnimation(float DeltaSeconds) override;
protected:
//所属英雄角色
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "AnimData|Refrences")
AWarriorHeroCharacter* OwningHeroCharacter;
//是否进入休闲状态?
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "AnimData|LocomotionData")
bool bShouldEnterRelaxState =false;
//进入松弛状态阈值
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "AnimData|LocomotionData")
float EnterRelaxStateThreshold = 5.f;
//角色处于空闲状态的持续时间
UPROPERTY()
float IdleElapsedTime = 0.f;
};
Source/Warrior/Private/AnimInstances/Hero/WarriorHeroAnimInstance.cpp
// Copyright @ ChenChao
#include "AnimInstances/Hero/WarriorHeroAnimInstance.h"
#include "Characters/WarriorHeroCharacter.h"
void UWarriorHeroAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
if (OwningCharacter)
{
//所属英雄角色赋值
OwningHeroCharacter = Cast<AWarriorHeroCharacter>(OwningCharacter);
}
}
void UWarriorHeroAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds)
{
Super::NativeThreadSafeUpdateAnimation(DeltaSeconds);
//角色运动,就重置时间
if (bHasAcceleration)
{
bShouldEnterRelaxState = false;
IdleElapsedTime = 0.f;
}
else
{
IdleElapsedTime += DeltaSeconds; //累计时间
if (IdleElapsedTime >= EnterRelaxStateThreshold)
{
bShouldEnterRelaxState = true;
}
}
}
这段Unreal Engine动画实例代码实现了角色空闲状态计时功能,主要逻辑分析如下:
-
初始化处理
- 在
NativeInitializeAnimation()中通过类型转换获取所属角色对象引用 - 使用
Cast确保角色类型匹配,避免直接访问导致的运行时错误
- 在
-
空闲状态检测机制
- 通过
bHasAcceleration判断角色是否移动 - 移动时重置
IdleElapsedTime计时器并关闭放松状态标志8 - 静止时累计
DeltaSeconds实现精确时间统计
- 通过
-
状态转换控制
- 当空闲时间超过
EnterRelaxStateThreshold阈值时 - 设置
bShouldEnterRelaxState触发待机动画状态切换 - 这种阈值控制方式常见于游戏角色的次级动作触发
- 当空闲时间超过
-
线程安全设计
- 使用
NativeThreadSafeUpdateAnimation而非常规更新方法 - 确保动画更新在多线程环境下安全执行
- 使用
该实现方式与Unity中的状态机计时逻辑类似,但采用了UE特有的线程安全更新机制。计时器实现原理与常规游戏计时器相同,通过逐帧累加时间差值实现精确控制。
4.编译,在UE动画蓝图里设置过渡规则:


1324

被折叠的 条评论
为什么被折叠?



