后记:一觉醒来,突然觉得像下文这么做有点多此一举,所以大家还是使用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<APawn>(OwnerActor); } return NULL; }
- 先获取到动画蓝图所属的组件(OwnerComponent)
- 然后再获取OwnerComponent的所属OwnerActor
- 最后还要把OwnerActor(AActor类型)向下强制类型转换成APawn。
知道了原理以后,看上面这段蓝图,感觉非常别扭。 应该是为了借用APawn里的GetMovementComponent所以才用了一个“下行转换”。
我把它改成下面这样,至少在自己看来,舒服多了。
- 先获取到动画蓝图所属的组件(OwnerComponent)
- 然后再获取OwnerComponent的所属OwnerActor
- 然后通过GetComponentByClass找到NavMovement Component
如果觉得这种方法麻烦,可以参考《UE4基础:派生一个AnimInstance类》