后记:一觉醒来,突然觉得像下文这么做有点多此一举,所以大家还是使用TryGetPawnOwner
吧。
新建一个动画蓝图,总是会默认提供一个TryGetPawnOwner
方法的节点,这意味着该方法很常用。
它的原型如下:
//AnimInstance.h
UFUNCTION(BlueprintCallable, Category = "Animation", meta=(NotBlueprintThreadSafe))
virtual APawn* TryGetPawnOwner() const;
//AnimInstance.cpp
APawn* UAnimInstance::TryGetPawnOwner() const
{
USkeletalMeshComponent* OwnerComponent = GetSkelMeshComponent();
if (AActor* OwnerActor = OwnerComponent->GetOwner())
{
return Cast(OwnerActor);
}
return NULL;
}
- 先获取到动画蓝图所属的组件(
OwnerComponent
) - 然后再获取
OwnerComponent
的所属OwnerActor
- 最后还要把
OwnerActor
(AActor
类型)向下强制类型转换成APawn
。
知道了原理以后,看上面这段蓝图,感觉非常别扭。 应该是为了借用APawn
里的GetMovementComponent
所以才用了一个“下行转换”。
我把它改成下面这样,至少在自己看来,舒服多了。
- 先获取到动画蓝图所属的组件(
OwnerComponent
) - 然后再获取
OwnerComponent
的所属OwnerActor
- 然后通过
GetComponentByClass
找到NavMovement Component
如果觉得这种方法麻烦,可以参考《UE4基础:派生一个AnimInstance类》