後記:一覺醒來,突然覺得像下文這麼做有點多此一舉,所以大家還是使用
TryGetPawnOwner
吧。
上文修改了默認動畫藍圖中的節點,雖然邏輯上清晰了,但是由於步驟多了一些,所以藍圖有點亂了,既然是常用的方法,那不如直接派生一個AnimInstance
,並增加這個獲取同級的Component
的方法。
MyAnimInstance類
自定義了一個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<UActorComponent> ComponentClass) const;
};
//MyAnimInstance.cpp
#include "MyAnimInstance.h"
UActorComponent* UMyAnimInstance::GetSiblingComponentByClass(TSubclassOf<UActorComponent> ComponentClass) const
{
USkeletalMeshComponent* OwnerComponent = GetSkelMeshComponent();
if (AActor* OwnerActor = OwnerComponent->GetOwner())
{
return OwnerActor->GetComponentByClass(ComponentClass);
}
return NULL;
}
新建動畫藍圖
繼承自MyAnimInstance
這樣藍圖也簡化多了