UE5 学习记录

>> 关键概念

  1. InputMappingContext,包含一堆InputAction
  2. InputAction,即单个行为,例如:MoveHorizontal
  3. PlayerController 必须Possess(占有)一个Pawn,Pawn才会执行SetupPlayerInputComponent,因此可以创建一个InputModule继承自APawn
    1. DefaultPawn会被自动Possess
    2. 可手动调用APlayerController.Possess(pawn)

>> 快速入门

  1. 在xxx.Build.cs里添加“EnhancedInput”

  2. 创建InputAction,配置按键

  3. 创建InputMappingContext,并绑定InputAction

  4. (使用蓝图)创建PlayerController蓝图

    1. 写个C++

      // ==== .h ====
      #pragma once
      
      #include "CoreMinimal.h"
      #include "EnhancedInputComponent.h"
      #include "SJPlayerController.generated.h"
      
      UCLASS()
      class ASJPlayerController : public APlayerController {
          GENERATED_BODY()
      
      public:
          UFUNCTION(BlueprintCallable, Category = "Input")
          void AnyAction();
      };
      
      // ==== .cpp ====
      #include "SJPlayerController.h"
      
      void ASJPlayerController::AnyAction() {
      
      }
      
    2. 创建蓝图并在GameMode的PlayerControllerClass绑定

    3. 蓝图里初始化

      Untitled

    4. 蓝图里绑定触发函数

      Untitled

  5. (使用C++)

// MyPlayerController.cpp
if (ULocalPlayer *LocalPlayer = GetLocalPlayer()) {
    if (UEnhancedInputLocalPlayerSubsystem *inputSubSystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>()) {
        inputSubSystem->AddMappingContext(inputModule->mappingContext.LoadSynchronous(), 1);
    }
}
  1. 绑定Action
// MyInputModule.cpp
void AInputModule::SetupPlayerInputComponent(UInputComponent* _inputComponent) {
	Super::SetupPlayerInputComponent(_inputComponent);
	if (UEnhancedInputComponent* EnhancedInput = Cast<UEnhancedInputComponent>(_inputComponent)) {
        EnhancedInput->BindAction(action_moveHorizontal, ETriggerEvent::Triggered, this, &AInputModule::OnMoveHorizontal);
        EnhancedInput->BindAction(action_moveVertical, ETriggerEvent::Triggered, this, &AInputModule::OnMoveVertical);
	}
}

void AInputModule::OnMoveHorizontal(const FInputActionValue& Value) {
	float axis = Value.Get<float>();
	moveAxis.X = axis;
}

void AInputModule::OnMoveVertical(const FInputActionValue& Value) {
	float axis = Value.Get<float>();
	moveAxis.Y = axis;
}