后记:一觉醒来,突然觉得像下文这么做有点多此一举,所以大家还是使用TryGetPawnOwner
吧。
书接上文 《UE4杂文:关于官方模板动画蓝图中TryGetPawnOwner方法的讨论》
上文修改了默认动画蓝图中的节点,虽然逻辑上清晰了,但是由于步骤多了一些,所以蓝图有点乱了,既然是常用的方法,那不如直接派生一个AnimInstance
,并增加这个获取同级的Component
的方法。
自定义了一个GetSiblingComponentByClass
方法
//MyAnimInstance.h
#pragma once
#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "MyAnimInstance.generated.h"
UCLASS(transient, Blueprintable, hideCategories=AnimInstance, BlueprintType, meta=(BlueprintThreadSafe), Within=SkeletalMeshComponent)
class THIRDPERSONCPP_API UMyAnimInstance : public UAnimInstance
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable)
UActorComponent* GetSiblingComponentByClass(TSubclassOf ComponentClass) const;
};
//MyAnimInstance.cpp
#include "MyAnimInstance.h"
UActorComponent* UMyAnimInstance::GetSiblingComponentByClass(TSubclassOf ComponentClass) const
{
USkeletalMeshComponent* OwnerComponent = GetSkelMeshComponent();
if (AActor* OwnerActor = OwnerComponent->GetOwner())
{
return OwnerActor->GetComponentByClass(ComponentClass);
}
return NULL;
}
新建动画蓝图
继承自MyAnimInstance
这样蓝图也简化多了