虚幻引擎UE5 GAS开发RPG游戏-02 设置英雄角色-11 英雄动画实例

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

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动画实例代码实现了角色空闲状态计时功能,主要逻辑分析如下:

  1. 初始化处理

    • NativeInitializeAnimation()中通过类型转换获取所属角色对象引用
    • 使用Cast确保角色类型匹配,避免直接访问导致的运行时错误
  2. 空闲状态检测机制

    • 通过bHasAcceleration判断角色是否移动
    • 移动时重置IdleElapsedTime计时器并关闭放松状态标志8
    • 静止时累计DeltaSeconds实现精确时间统计
  3. 状态转换控制

    • 当空闲时间超过EnterRelaxStateThreshold阈值时
    • 设置bShouldEnterRelaxState触发待机动画状态切换
    • 这种阈值控制方式常见于游戏角色的次级动作触发
  4. 线程安全设计

    • 使用NativeThreadSafeUpdateAnimation而非常规更新方法
    • 确保动画更新在多线程环境下安全执行

该实现方式与Unity中的状态机计时逻辑类似,但采用了UE特有的线程安全更新机制。计时器实现原理与常规游戏计时器相同,通过逐帧累加时间差值实现精确控制。

4.编译,在UE动画蓝图里设置过渡规则:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值