UE4 Navigationの方向だけを取得したい!
Navigationとは、NavMeshに従ってPawnを指定した場所に最短距離で壁などにぶつかることなく、進ませてくるUE4の機能です。
敵のAIを作るのに重宝する機能ですが、現状ではPawnを移動させることにしか使えません。用途によっては、方向だけ欲しいということもあると思います。例えば、プレイヤーを誘導する矢印を出したり、UE4が用意しているMovementComponentとは違う移動を自分で実装したい時などです。
ここでは、そのNavigation方向を取得する方法を紹介します。
現在は残念ながら、Navigation情報そのものにアクセスする手段がBPに公開されていませんので、C++を使わないと取得することができません。
MovementComponentをC++で自作するのが一番簡単です。
UNavMovementComponent*1::ReqeustDirectMoveでインターセプト
もろもろNavigationに関する計算が行われて進むべき速度が、UNavMovementComponent::ReqeustDirectMoveメソッドに渡って来ます。ReqeustDirectMoveメソッドをオーバーライドしてやることでNavigation方向をインターセプトすることができます。
MovementComponentは内部で結構いろんな処理を行っているので、自作をする場合はCharacterMovementかFloatingPawnMovementを継承して作るのが良いと思います。
コード例
UCLASS(ClassGroup=Movement, meta=(BlueprintSpawnableComponent)) class PROJECT_API UMyPawnMovement : public UFloatingPawnMovement { GENERATED_BODY() public: virtual void RequestDirectMove(const FVector& MoveVelocity, bool bForceMaxSpeed) override; { NavVelocity = MoveVelocity; Super::RequestDirectMove(MoveVelocity,bForceMaxSpeed); } public: UFUNCTION(BlueprintCallable, Category="TopViewPawnMovement") FVector GetNavVelocity()const{ return NavVelocity; } private: FVector NavVelocity; };
ちなみに、RequestDirectMoveメソッドが呼ばれるのは、PathFollowingComponent*2のTickComponentのタイミングです。