第一次提交

This commit is contained in:
不明不惑
2026-03-03 01:23:02 +08:00
commit 3e434877e8
1053 changed files with 102411 additions and 0 deletions

View File

@@ -0,0 +1,550 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "EnhancedInputComponent.h"
#include "GameplayTagContainer.h"
#include "GIPS_InputProcessor.h"
#include "GIPS_InputTypes.h"
#include "GIPS_InputSystemComponent.generated.h"
class UGIPS_InputControlSetup;
class UInputMappingContext;
class UGIPS_InputConfig;
class UEnhancedInputLocalPlayerSubsystem;
/**
* Core component for handling input in the Generic Input System.
* 通用输入系统中处理输入的核心组件。
* @attention Must be attached to a Pawn or PlayerController. 必须挂载到Pawn或PlayerController上。
*/
UCLASS(ClassGroup=GIPS, Blueprintable, meta=(BlueprintSpawnableComponent), AutoExpandCategories=("GIPS"))
class GENERICINPUTSYSTEM_API UGIPS_InputSystemComponent : public UActorComponent
{
GENERATED_BODY()
friend UGIPS_InputControlSetup;
public:
enum class EGIPS_OwnerType:uint8
{
Pawn,
PC,
};
public:
UGIPS_InputSystemComponent(const FObjectInitializer& ObjectInitializer);
//~ Begin UActorComponent interface
/**
* Called when the component is registered.
* 组件注册时调用。
*/
virtual void OnRegister() override;
/**
* Called when the component is unregistered.
* 组件取消注册时调用。
*/
virtual void OnUnregister() override;
//~ End UActorComponent interface
/**
* Gets the Pawn associated with this component.
* 获取与此组件关联的Pawn。
* @return The associated Pawn, or the Pawn controlled by the PlayerController if the owner is a PlayerController. 如果拥有者是Pawn则返回Pawn如果是PlayerController则返回其控制的Pawn。
*/
UFUNCTION(BlueprintPure, Category="GIPS|Input")
APawn* GetControlledPawn() const;
/**
* Gets the input system component from an actor.
* 从演员获取输入系统组件。
* @param Actor The actor to query. 要查询的演员。
* @return The input system component, or nullptr if not found. 输入系统组件如果未找到则返回nullptr。
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "GIPS|Input", Meta = (DefaultToSelf="Actor"))
static UGIPS_InputSystemComponent* GetInputSystemComponent(const AActor* Actor);
/**
* Finds the input system component on an actor.
* 在演员上查找输入系统组件。
* @param Actor The actor to query. 要查询的演员。
* @param Component The found component (output). 找到的组件(输出)。
* @return True if the component was found, false otherwise. 如果找到组件则返回true否则返回false。
*/
UFUNCTION(BlueprintCallable, Category = "GIPS|Input", Meta = (DefaultToSelf="Actor", ExpandBoolAsExecs="ReturnValue"))
static bool FindInputSystemComponent(const AActor* Actor, UGIPS_InputSystemComponent*& Component);
/**
* Event triggered when setting up the input component.
* 设置输入组件时触发的事件。
*/
UPROPERTY(BlueprintAssignable, Category="GIPS|Input")
FGIPS_InputComponentSignature SetupInputComponentEvent;
/**
* Event triggered when cleaning up the input component.
* 清理输入组件时触发的事件。
*/
UPROPERTY(BlueprintAssignable, Category="GIPS|Input")
FGIPS_InputComponentSignature CleanupInputComponentEvent;
/**
* Event triggered when the input buffer window state changes.
* 输入缓冲窗口状态改变时触发的事件。
*/
UPROPERTY(BlueprintAssignable, Category="GIPS|Input")
FGIPS_InputBufferWindowStateChangedSignature InputBufferWindowStateChangedEvent;
protected:
/**
* Sets up the player input component (Blueprint-implementable).
* 设置玩家输入组件(可通过蓝图实现)。
* @param NewInputComponent The new input component. 新输入组件。
*/
UFUNCTION(BlueprintNativeEvent, Category="GIPS|Input")
void OnSetupPlayerInputComponent(UEnhancedInputComponent* NewInputComponent);
virtual void OnSetupPlayerInputComponent_Implementation(UEnhancedInputComponent* NewInputComponent);
/**
* Cleans up the player input component (Blueprint-implementable).
* 清理玩家输入组件(可通过蓝图实现)。
* @param PrevInputComponent The previous input component. 前一个输入组件。
*/
UFUNCTION(BlueprintNativeEvent, Category="GIPS|Input")
void OnCleanupPlayerInputComponent(UEnhancedInputComponent* PrevInputComponent);
virtual void OnCleanupPlayerInputComponent_Implementation(UEnhancedInputComponent* PrevInputComponent);
/**
* Called when the pawn restarts.
* 当Pawn重启时调用。
* @param Pawn The pawn that restarted. 重启的Pawn。
*/
UFUNCTION()
virtual void OnPawnRestarted(APawn* Pawn);
/**
* Called when the controller changes.
* 当控制器更改时调用。
* @param Pawn The associated pawn. 关联的Pawn。
* @param OldController The previous controller. 前一个控制器。
* @param NewController The new controller. 新控制器。
*/
UFUNCTION()
virtual void OnControllerChanged(APawn* Pawn, AController* OldController, AController* NewController);
/**
* Cleans up input action value bindings.
* 清理输入动作值绑定。
*/
void CleanInputActionValueBindings();
/**
* Sets up input action value bindings.
* 设置输入动作值绑定。
*/
void SetupInputActionValueBindings();
/**
* Sets up the input component.
* 设置输入组件。
* @param NewInputComponent The new input component. 新输入组件。
*/
virtual void SetupInputComponent(UInputComponent* NewInputComponent);
/**
* Cleans up the input component.
* 清理输入组件。
* @param OldController The previous controller (optional). 前一个控制器(可选)。
*/
virtual void CleanupInputComponent(AController* OldController = nullptr);
/**
* Gets the enhanced input subsystem.
* 获取增强输入子系统。
* @param OldController The previous controller (optional). 前一个控制器(可选)。
* @return The enhanced input subsystem. 增强输入子系统。
*/
UEnhancedInputLocalPlayerSubsystem* GetEnhancedInputSubsystem(AController* OldController = nullptr) const;
/**
* The bound input component.
* 绑定的输入组件。
*/
UPROPERTY(transient)
TObjectPtr<UEnhancedInputComponent> InputComponent;
/**
* The type of owner (Pawn or PlayerController).
* 拥有者类型Pawn或PlayerController
*/
EGIPS_OwnerType OwnerType = EGIPS_OwnerType::PC;
protected:
/**
* Binds input actions to the component.
* 将输入动作绑定到组件。
*/
void BindInputActions();
/**
* Input mapping context to be added to the enhanced input subsystem.
* 将添加到增强输入子系统的输入映射上下文。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GIPS|Input")
TObjectPtr<UInputMappingContext> InputMappingContext;
/**
* Priority for binding the input mapping context.
* 绑定输入映射上下文的优先级。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GIPS|Input")
int32 InputPriority = 0;
/**
* Main configuration for the input system.
* 输入系统的主配置。
*/
UPROPERTY(EditDefaultsOnly, Category="GIPS|Input")
TObjectPtr<UGIPS_InputConfig> InputConfig;
/**
* Maximum number of input entries to keep.
* 保留的最大输入记录数。
*/
UPROPERTY(EditDefaultsOnly, Category="GIPS|Input", meta=(ClampMin=0, ClampMax=10))
int32 MaxInputEntriesNum{5};
/**
* If true, inputs are processed externally via OnReceivedInput event.
* 如果为true输入通过OnReceivedInput事件在外部处理。
*/
UPROPERTY(EditDefaultsOnly, Category="GIPS|Input")
bool bProcessingInputExternally{false};
/**
* List of input control setups, with the last one being the current setup.
* 输入控制设置列表,最后一个为当前设置。
*/
UPROPERTY(EditAnywhere, Category="GIPS|Input")
TArray<TObjectPtr<UGIPS_InputControlSetup>> InputControlSetups;
public:
#pragma region InputControl
/**
* Gets the current input control setup.
* 获取当前输入控制设置。
* @return The last input control setup in the list. 列表中的最后一个输入控制设置。
*/
UFUNCTION(BlueprintPure, Category="GIPS|Input")
UGIPS_InputControlSetup* GetCurrentInputSetup() const;
/**
* Gets the input configuration.
* 获取输入配置。
* @return The input configuration. 输入配置。
*/
UFUNCTION(BlueprintPure, Category="GIPS|Input")
UGIPS_InputConfig* GetInputConfig() const;
/**
* Sets a new input control setup as the current one.
* 将新的输入控制设置设为当前设置。
* @param NewSetup The new input control setup. 新输入控制设置。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|Input")
virtual void PushInputSetup(UGIPS_InputControlSetup* NewSetup);
/**
* Removes the current input setup, making the last one in the list the new current setup.
* 删除当前输入设置,使列表中的最后一个成为新的当前设置。
* @attention Does nothing if only one setup exists. 如果只有一个设置,则无操作。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|Input")
virtual void PopInputSetup();
#pragma endregion
/**
* Checks if an input is allowed.
* 检查输入是否被允许。
* @param InputTag The gameplay tag for the input. 输入的游戏标签。
* @param TriggerEvent The trigger event type. 触发事件类型。
* @return True if the input is allowed, false otherwise. 如果输入被允许则返回true否则返回false。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|Input", meta=(ExpandBoolAsExecs="ReturnValue"))
virtual bool CheckInputAllowed(UPARAM(meta = (Categories="InputTag,GIPS.InputTag"))
FGameplayTag InputTag, ETriggerEvent TriggerEvent);
/**
* Checks if an input is allowed with action data.
* 使用动作数据检查输入是否被允许。
* @param ActionData The input action data. 输入动作数据。
* @param InputTag The gameplay tag for the input. 输入的游戏标签。
* @param TriggerEvent The trigger event type. 触发事件类型。
* @return True if the input is allowed, false otherwise. 如果输入被允许则返回true否则返回false。
*/
// UFUNCTION(BlueprintCallable, Category="GIPS|Input", meta=(ExpandBoolAsExecs="ReturnValue", AutoCreateRefTerm="ActionData"))
virtual bool CheckInputAllowed(const FInputActionInstance& ActionData, UPARAM(meta = (Categories="InputTag,GIPS.InputTag"))
FGameplayTag InputTag, ETriggerEvent TriggerEvent);
/**
* Processes an input action.
* 处理输入动作。
* @param ActionData The input action data. 输入动作数据。
* @param InputTag The gameplay tag for the input. 输入的游戏标签。
* @param TriggerEvent The trigger event type. 触发事件类型。
*/
// UFUNCTION(BlueprintCallable, Category="GIPS|Input")
virtual void ProcessInput(const FInputActionInstance& ActionData, const FGameplayTag& InputTag, ETriggerEvent TriggerEvent);
/**
* Gets the input action associated with a tag.
* 获取与标签关联的输入动作。
* @param InputTag The gameplay tag for the input. 输入的游戏标签。
* @return The associated input action. 关联的输入动作。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|Input")
UInputAction* GetInputActionOfInputTag(UPARAM(meta = (Categories="InputTag,GIPS.InputTag"))
FGameplayTag InputTag) const;
/**
* Gets the current input action value for a tag.
* 获取标签的当前输入动作值。
* @param InputTag The gameplay tag for the input. 输入的游戏标签。
* @return The current input action value. 当前输入动作值。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|Input")
FInputActionValue GetInputActionValueOfInputTag(UPARAM(meta = (Categories="InputTag,GIPS.InputTag"))
FGameplayTag InputTag) const;
/**
* Gets the last input action value for a tag.
* 获取标签的最后输入动作值。
* @param InputTag The gameplay tag for the input. 输入的游戏标签。
* @return The last input action value. 最后输入动作值。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|Input")
FInputActionValue GetLastInputActionValueOfInputTag(UPARAM(meta = (Categories="InputTag,GIPS.InputTag"))
FGameplayTag InputTag) const;
/**
* Gets the list of passed input entries.
* 获取通过的输入记录列表。
* @return Array of passed input entries. 通过的输入记录数组。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|Input")
TArray<FGIPS_BufferedInput> GetPassedInputEntries() const { return PassedInputEntries; };
/**
* Registers a passed input entry.
* 注册通过的输入记录。
* @param InputEntry The input entry to register. 要注册的输入记录。
*/
virtual void RegisterPassedInputEntry(const FGIPS_BufferedInput& InputEntry);
/**
* Gets the list of blocked input entries.
* 获取阻止的输入记录列表。
* @return Array of blocked input entries. 阻止的输入记录数组。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|Input")
TArray<FGIPS_BufferedInput> GetBlockedInputEntries() const { return BlockedInputEntries; };
/**
* Registers a blocked input entry.
* 注册阻止的输入记录。
* @param InputEntry The input entry to register. 要注册的输入记录。
*/
virtual void RegisterBlockedInputEntry(const FGIPS_BufferedInput& InputEntry);
/**
* Gets the list of buffered input entries.
* 获取缓冲的输入记录列表。
* @return Array of buffered input entries. 缓冲的输入记录数组。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|Input")
TArray<FGIPS_BufferedInput> GetBufferedInputEntries() const { return BufferedInputEntries; };
/**
* Registers a buffered input entry.
* 注册缓冲的输入记录。
* @param InputEntry The input entry to register. 要注册的输入记录。
*/
virtual void RegisterBufferedInputEntry(const FGIPS_BufferedInput& InputEntry);
/**
* Event triggered when an input action generates an event.
* 输入动作生成事件时触发的事件。
*/
UPROPERTY(BlueprintAssignable)
FGIPS_ReceivedInputSignature OnReceivedInput;
protected:
/**
* Callback for input action events.
* 输入动作事件的回调。
* @param ActionData The input action data. 输入动作数据。
* @param InputTag The gameplay tag for the input. 输入的游戏标签。
* @param TriggerEvent The trigger event type. 触发事件类型。
*/
UFUNCTION()
void InputActionCallback(const FInputActionInstance& ActionData, FGameplayTag InputTag, ETriggerEvent TriggerEvent);
/**
* Mapping of input tags to action value bindings.
* 输入标签到动作值绑定的映射。
*/
UPROPERTY(VisibleInstanceOnly, Category="GIPS|Input", meta=(ForceInlineRow))
TMap<FGameplayTag, int32> InputActionValueBindings;
/**
* Tracks the last action value for each input action.
* 跟踪每个输入动作的最后动作值。
*/
UPROPERTY(VisibleInstanceOnly, Category="GIPS|Input", meta=(ForceInlineRow))
TMap<FGameplayTag, FInputActionValue> LastInputActionValues;
/**
* List of passed input entries.
* 通过的输入记录列表。
*/
UPROPERTY(VisibleAnywhere, Category="GIPS|Input")
TArray<FGIPS_BufferedInput> PassedInputEntries;
/**
* List of blocked input entries.
* 阻止的输入记录列表。
*/
UPROPERTY(VisibleAnywhere, Category="GIPS|Input")
TArray<FGIPS_BufferedInput> BlockedInputEntries;
/**
* List of buffered input entries.
* 缓冲的输入记录列表。
*/
UPROPERTY(VisibleAnywhere, Category="GIPS|Input")
TArray<FGIPS_BufferedInput> BufferedInputEntries;
#pragma region InputBuffer
public:
/**
* Attempts to save an input to the buffer.
* 尝试将输入保存到缓冲区。
* @param ActionData The input action data. 输入动作数据。
* @param InputTag The gameplay tag for the input. 输入的游戏标签。
* @param TriggerEvent The trigger event type. 触发事件类型。
* @return True if the input was saved, false otherwise. 如果输入被保存则返回true否则返回false。
*/
bool TrySaveInput(const FInputActionInstance& ActionData, const FGameplayTag& InputTag, ETriggerEvent TriggerEvent);
/**
* Fires buffered input actions.
* 触发缓冲的输入动作。
*/
void FireBufferedInput();
/**
* Event triggered when buffered input is fired.
* 缓冲输入触发时的事件。
*/
UPROPERTY(BlueprintAssignable)
FGIPS_ReceivedInputSignature OnFireBufferedInput;
/**
* Opens an input buffer window to allow input saving.
* 开启输入缓冲窗口以允许保存输入。
* @param BufferWindowName The name of the buffer window to open. 要开启的缓冲窗口名称。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|InputBuffer")
virtual void OpenInputBufferWindow(UPARAM(meta=(Categories="GIPS.InputBuffer"))
FGameplayTag BufferWindowName);
/**
* Closes an input buffer window.
* 关闭输入缓冲窗口。
* @param BufferWindowName The name of the buffer window to close. 要关闭的缓冲窗口名称。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|InputBuffer")
virtual void CloseInputBufferWindow(UPARAM(meta=(Categories="GIPS.InputBuffer"))
FGameplayTag BufferWindowName);
/**
* Closes all active input buffer windows.
* 关闭所有激活的输入缓冲窗口。
*/
UFUNCTION(BlueprintCallable, Category="GIPS|InputBuffer")
virtual void CloseActiveInputBufferWindows();
/**
* Gets the last buffered input.
* 获取最后缓冲的输入。
* @return The last buffered input. 最后缓冲的输入。
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category="GIPS|InputBuffer")
FGIPS_BufferedInput GetLastBufferedInput() const;
/**
* Gets all currently active buffer windows.
* 获取当前所有激活的缓冲窗口。
* @return Map of active buffer windows. 激活的缓冲窗口映射。
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category="GIPS|InputBuffer")
TMap<FGameplayTag, FGIPS_BufferedInput> GetActiveBufferWindows() const;
protected:
/**
* Resets the buffered input.
* 重置缓冲输入。
*/
void ResetBufferedInput();
/**
* Attempts to save an input as a buffered input.
* 尝试将输入保存为缓冲输入。
* @param BufferWindowName The buffer window name. 缓冲窗口名称。
* @param ActionData The input action data. 输入动作数据。
* @param InputTag The gameplay tag for the input. 输入的游戏标签。
* @param TriggerEvent The trigger event type. 触发事件类型。
* @return True if the input was saved, false otherwise. 如果输入被保存则返回true否则返回false。
*/
bool TrySaveAsBufferedInput(const FGameplayTag BufferWindowName, const FInputActionInstance& ActionData, const FGameplayTag& InputTag, ETriggerEvent TriggerEvent);
/**
* Map of currently active input buffer windows.
* 当前激活的输入缓冲窗口映射。
*/
UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category="GIPS|InputBuffer", meta=(ForceInlineRow))
TMap<FGameplayTag, FGIPS_BufferedInput> ActiveBufferWindows;
/**
* The last fired buffered input.
* 最后触发的缓冲输入。
*/
UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category="GIPS|InputBuffer")
FGIPS_BufferedInput LastBufferedInput;
/**
* The current buffered input.
* 当前缓冲输入。
*/
UPROPERTY()
FGIPS_BufferedInput CurrentBufferedInput;
#pragma endregion
#pragma region DataValidation
#if WITH_EDITOR
/**
* Validates the component data in the editor.
* 在编辑器中验证组件数据。
* @param Context The data validation context. 数据验证上下文。
* @return The validation result. 验证结果。
*/
virtual EDataValidationResult IsDataValid(FDataValidationContext& Context) const override;
#endif
#pragma endregion
};