void ASECharacterController::Tick(float DeltaSeconds)
{
   Super::Tick(DeltaSeconds);

   if (auto PS = CastChecked<ASECharacterState>(PlayerState))
   {
      auto LocalPlayer = CastChecked<ULocalPlayer>(this->Player);
      auto ViewportClient = LocalPlayer->ViewportClient;
      FViewport* Viewport = ViewportClient->Viewport;
      FVector2D ViewportSize;


      switch (PS->CursorState)
      {
      case ECharacterCursorState::Uncontrolled:
         this->bShowMouseCursor = true;
         Viewport->LockMouseToViewport(false);
         Viewport->CaptureMouse(false);
         break;
      case ECharacterCursorState::Free:
          this->bShowMouseCursor = false;
         Viewport->LockMouseToViewport(true);
         Viewport->CaptureMouse(false);
         break;
      case ECharacterCursorState::Locked:
          this->bShowMouseCursor = false;
         Viewport->LockMouseToViewport(true);
         Viewport->CaptureMouse(true);
         ViewportClient->GetViewportSize(ViewportSize);
         const int32 X = static_cast<int32>(ViewportSize.X * 0.5f);
         const int32 Y = static_cast<int32>(ViewportSize.Y * 0.5f);

         Viewport->SetMouse(X, Y);
         break;
      }
   }
}