GameProgrammar's Night

ゲームプログラム系の覚え書き

UE4 Navigationの方向だけを取得したい!

 Navigationとは、NavMeshに従ってPawnを指定した場所に最短距離で壁などにぶつかることなく、進ませてくるUE4の機能です。

docs.unrealengine.com

 敵の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のタイミングです。

*1:FloatingPawnMovementやCharacterMovementが継承しているNavgation移動のクラス

*2:AIControllerが持つNavigationの計算をメインに行っているコンポーネント