UE4C++学习篇(十一)--- 动画蓝图C++处理

如何使用C++来处理角色的动画蓝图呢?

基于AnimInstance类创建一个属于自己的动画实例,对于角色动画状态机的实现和切换部分还是使用编辑器中的动画图表和事件图表,只不过,在实际的使用变量操控播放动画时,使用C++的部分来控制。

状态机动画图表:

创建完属于自己的C++类,在动画蓝图的类设置里面将父类设置成自己创建的C++类。

.h代码

public:
	virtual void NativeInitializeAnimation() override;

	UFUNCTION(BlueprintCallable,Category = "Animation Properties")
	void UpdateAnimationProperties();

private:
	
UPROPERTY(BlueprintReadOnly,Category = "Animation Properties",meta = (AllowPrivateAccess = "true"))
	float Speed;//速度

UPROPERTY(BlueprintReadOnly, Category = "Animation Properties", meta = (AllowPrivateAccess = "true"))
	float Direction;//方向

UPROPERTY(BlueprintReadOnly, Category = "Animation Properties", meta = (AllowPrivateAccess = "true"))
	bool EnableJump;//是否能够跳跃

UPROPERTY(BlueprintReadOnly, Category = "Animation Properties", meta = (AllowPrivateAccess = "true"))
	bool Crouching;//是否蹲下

UPROPERTY(BlueprintReadOnly, Category = "Animation Properties", meta = (AllowPrivateAccess = "true"))
	ASGCharacter* PlayerRef;//角色引用

NativeInitializeAnimation函数是父类的虚函数,可以进行重写,在这个函数里面进行属性初始化。

UpdateAnimationProperties这个方法是在蓝图中使用,让其去不断更新获取最新的变量的值。

.cpp代码

#include "Animation/CharacterAnimInstance.h"
#include "Gameplay/SGCharacter.h"
#include "GameFramework/PawnMovementComponent.h"

void UCharacterAnimInstance::NativeInitializeAnimation()
{
	PlayerRef = Cast<ASGCharacter>(TryGetPawnOwner());
}

void UCharacterAnimInstance::UpdateAnimationProperties()
{
	if(!PlayerRef)
	{
		PlayerRef = Cast<ASGCharacter>(TryGetPawnOwner());
	}
	if (PlayerRef)
	{
		const FVector SpeedVector = PlayerRef->GetVelocity();
		const FVector NewVector = FVector(SpeedVector.X, SpeedVector.Y, 0);
		Speed = NewVector.Size();

		Direction = CalculateDirection(SpeedVector, PlayerRef->GetActorRotation());

		EnableJump = PlayerRef->GetMovementComponent()->IsFalling();

		Crouching = PlayerRef->GetMovementComponent()->IsCrouching();
	}
}

 此时会不断去更新变量里面的值,而在C++中声明的变量,则是去控制状态机的状态变化。

 比如这个跳跃的判断,满足这些条件就会去改变角色的状态,进而切换对应的动画。

注:

除了在蓝图中去更新变量,还有一个C++方法,也是去不断更新。

virtual void NativeUpdateAnimation(float DeltaSeconds) override;

但是要注意这个方法是在编辑状态下也会执行,有可能在为动画蓝图设置自己的父类的时候,编辑器崩溃,可以使用预编译指令WITH_EDITOR,否则也会警告太多。

<think>好的,用户需要寻找关于Unreal Engine 4 C++的教程,并且已经提供了三个相关的引用内容。我需要根据这些引用信息来组织回答,确保符合用户给出的格式要求,比如使用正确的LaTeX格式,生成相关问题,以及正确添加引用标识。 首先,我需要确认用户的具体需求。他们可能是一个刚接触UE4的开发者,想要学习如何在UE4中使用C++进行开发。引用1和引用2是上下两部分的入门教程,涵盖基础项目设置、类创建、蓝图交互等,而引用3涉及射线碰撞的具体应用,属于更高级的内容。因此,回答的结构应该先从基础开始,再逐步深入。 接下来,我需要按照用户提供的系统级指令来组织内容。回答需要分为几个部分,每个部分对应一个教程或主题,并附上相关的问题生成。同时,每个引用的末尾需要自然地添加引用标识,例如[^1]、[^2]、[^3]。 然后,检查LaTeX的使用是否正确。用户要求行内数学表达式用$...$,独立公式用$$...$$,但当前内容中没有涉及数学公式,所以可能不需要使用。不过要确保如果有相关内容的话,格式正确。 生成相关问题部分需要考虑用户可能进一步想知道的内容,比如基础教程之后如何深入,或者射线碰撞的具体实现细节,以及如何结合蓝图C++等。确保问题与提供的引用内容相关,并且能够引导用户进一步探索。 最后,确保整个回答结构清晰,分点明确,引用正确,并且使用中文。同时,检查是否有遗漏的引用或格式错误,比如确保每个引用标记对应正确的来源。</think>### Unreal Engine 4 C++ 教程指南 #### 1. **基础入门教程** - **教程内容**:适合初学者的UE4 C++开发基础,包括环境配置、项目创建、C++类与蓝图的交互等。例如,通过声明C++函数并在蓝图中调用,可实现策划与程序协作开发。 - **关键点**: -UE4中创建C++类并绑定到Actor或组件。 - 使用`UFUNCTION`宏实现C++蓝图的通信。 - **示例代码**: ```cpp // 在C++中声明可在蓝图中调用的跳跃函数 UFUNCTION(BlueprintCallable, Category = "Movement") void Jump(); ``` #### 2. **射线碰撞与物理交互** - **应用场景**:射线检测常用于武器攻击、物体拾取等,例如激光击中目标后触发特效。 - **实现步骤**: 1. 使用`LineTraceByChannel`或`LineTraceSingleByChannel`函数发射射线。 2. 处理碰撞结果(如获取碰撞点坐标$p(x,y,z)$)。 - **代码片段**: ```cpp FHitResult HitResult; GetWorld()->LineTraceSingleByChannel(HitResult, StartLocation, EndLocation, ECC_Visibility); ``` #### 3. **进阶功能与优化** - **性能优化**:避免在每帧执行高开销操作(如复杂射线检测),可通过事件触发或异步任务优化。 - **多平台兼容性**:针对不同平台(如PC、移动端)调整C++代码的物理计算精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡西莫多说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值