134 lines
5.6 KiB
C++
134 lines
5.6 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "GameFramework/PlayerController.h"
|
|
#include "GIPS_InputTypes.h"
|
|
#include "PHYPlayerController.generated.h"
|
|
|
|
class APHYPlayerCharacter;
|
|
class UGIPS_InputSystemComponent;
|
|
|
|
/**
|
|
* @brief PHY 玩家控制器。
|
|
*
|
|
* 控制器不持有 GenericInputSystem 组件,只绑定当前玩家角色身上的输入组件,
|
|
* 并把 Input GameplayTag 路由到角色、ASC、移动和相机输入缓存。
|
|
*/
|
|
UCLASS(BlueprintType, Blueprintable)
|
|
class PHY_API APHYPlayerController : public APlayerController
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
/** @brief 构造控制器并设置 UGC 相机管理器。 */
|
|
APHYPlayerController(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
|
|
|
|
/** @brief 初始化输入委托。 */
|
|
virtual void BeginPlay() override;
|
|
|
|
/** @brief 接管 Pawn 时刷新输入委托。 */
|
|
virtual void OnPossess(APawn* InPawn) override;
|
|
|
|
/** @brief 获取当前玩家角色身上的 GenericInputSystem 组件。 */
|
|
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Input")
|
|
UGIPS_InputSystemComponent* GetInputSystemComponent() const;
|
|
|
|
/** @brief 获取当前 PHY 玩家角色。 */
|
|
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Input")
|
|
APHYPlayerCharacter* GetPHYPlayerCharacter() const;
|
|
|
|
/** @brief 获取相机使用的旋转输入缓存。 */
|
|
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Input")
|
|
FRotator GetCachedRotationInput() const { return CachedRotationInput; }
|
|
|
|
/** @brief 获取相机使用的移动控制输入缓存。 */
|
|
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Input")
|
|
FVector GetCachedMovementControlInput() const { return FVector(CachedMovementInput.X, CachedMovementInput.Y, 0.0f); }
|
|
|
|
/** @brief 从输入处理器或控制器 fallback 路由移动输入。 */
|
|
bool RouteMoveInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 从 GenericInputSystem 处理器路由移动输入,并阻止同一事件被 fallback 重复执行。 */
|
|
bool RouteMoveInputFromProcessor(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 从输入处理器或控制器 fallback 路由视角输入。 */
|
|
bool RouteLookInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 从 GenericInputSystem 处理器路由视角输入,并阻止同一事件被 fallback 重复执行。 */
|
|
bool RouteLookInputFromProcessor(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 路由角色属性菜单输入。 */
|
|
bool RouteOpenAttributeMenuInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 从 GenericInputSystem 处理器路由角色属性菜单输入,并阻止同一事件被 fallback 重复执行。 */
|
|
bool RouteOpenAttributeMenuInputFromProcessor(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
|
|
|
protected:
|
|
/** @brief 绑定玩家角色身上的 GenericInputSystem 输入委托。 */
|
|
virtual void BindInputEvents();
|
|
|
|
/** @brief 处理 GenericInputSystem 发出的输入事件。 */
|
|
UFUNCTION()
|
|
void OnReceivedInput(const FInputActionInstance& ActionData, const FGameplayTag& InputTag, ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 处理移动输入。 */
|
|
virtual bool HandleMoveInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 处理视角输入。 */
|
|
virtual bool HandleLookInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 处理角色属性菜单输入,本地推入 Generic UI Menu 层。 */
|
|
virtual bool HandleOpenAttributeMenuInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 查询并消费移动处理器留下的重复执行保护。 */
|
|
virtual bool ConsumeMoveProcessorGuard(ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 查询并消费视角处理器留下的重复执行保护。 */
|
|
virtual bool ConsumeLookProcessorGuard(ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 查询并消费属性菜单处理器留下的重复执行保护。 */
|
|
virtual bool ConsumeAttributeMenuProcessorGuard(ETriggerEvent TriggerEvent);
|
|
|
|
/** @brief 当前已经绑定输入委托的角色输入组件。 */
|
|
UPROPERTY(Transient)
|
|
TObjectPtr<UGIPS_InputSystemComponent> BoundInputSystemComponent;
|
|
|
|
/** @brief 本地移动输入缓存。 */
|
|
UPROPERTY(Transient)
|
|
FVector2D CachedMovementInput = FVector2D::ZeroVector;
|
|
|
|
/** @brief 本地视角输入缓存。 */
|
|
UPROPERTY(Transient)
|
|
FVector2D CachedLookInput = FVector2D::ZeroVector;
|
|
|
|
/** @brief UGC 相机管理器读取的旋转输入缓存。 */
|
|
UPROPERTY(Transient)
|
|
FRotator CachedRotationInput = FRotator::ZeroRotator;
|
|
|
|
/** @brief 输入处理器是否已经处理了最近一次 Move 输入。 */
|
|
UPROPERTY(Transient)
|
|
bool bMoveInputHandledByProcessor = false;
|
|
|
|
/** @brief 最近一次由输入处理器处理的 Move 触发事件。 */
|
|
UPROPERTY(Transient)
|
|
ETriggerEvent LastMoveInputProcessorTriggerEvent = ETriggerEvent::None;
|
|
|
|
/** @brief 输入处理器是否已经处理了最近一次 Look 输入。 */
|
|
UPROPERTY(Transient)
|
|
bool bLookInputHandledByProcessor = false;
|
|
|
|
/** @brief 最近一次由输入处理器处理的 Look 触发事件。 */
|
|
UPROPERTY(Transient)
|
|
ETriggerEvent LastLookInputProcessorTriggerEvent = ETriggerEvent::None;
|
|
|
|
/** @brief 输入处理器是否已经处理了最近一次属性菜单输入。 */
|
|
UPROPERTY(Transient)
|
|
bool bAttributeMenuInputHandledByProcessor = false;
|
|
|
|
/** @brief 最近一次由输入处理器处理的属性菜单触发事件。 */
|
|
UPROPERTY(Transient)
|
|
ETriggerEvent LastAttributeMenuInputProcessorTriggerEvent = ETriggerEvent::None;
|
|
};
|