创建MyCharacter C++类
在DEMO.Build.cs 脚本中添加增强输入模块
有个容易出错的点,这里的设置一定要正确
然后添加引用到C++头文件中
#include "InputActionValue.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
最后,可以编译一下,看看输入模块(“EnhancedInput” )是否引入成功。
首先,是头文件添加引用
MyCharacter.h
#pragma once
#include "CoreMinimal.h"
#include "InputActionValue.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "GameFramework/Controller.h"
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"
UCLASS()
class DEMO_API AMyCharacter : public ACharacter
{
GENERATED_BODY()
public:
// Sets default values for this character's properties
AMyCharacter();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent *PlayerInputComponent) override;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MySceneComponent")
USpringArmComponent *MySpringArm;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MySceneComponent")
UCameraComponent *MyCamera;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputMappingContext *DefaultMappingContext;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputAction* MoveAction;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputAction* LookAction;
void Move(const FInputActionValue& Value);
void Look(const FInputActionValue& Value);
};
然后在MyCharacter.cpp中实现
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyCharacter.h"
// Sets default values
AMyCharacter::AMyCharacter()
{
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
MySpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("MySpringArm"));
MyCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("MyCamera"));
MySpringArm->SetupAttachment(RootComponent);
MyCamera->SetupAttachment(MySpringArm);
MySpringArm->TargetArmLength = 300.0f;
// 这么设置是为了让控制器的转动不影响角色的转动,只影响摄像机的转动
bUseControllerRotationYaw = false;
bUseControllerRotationPitch = false;
bUseControllerRotationRoll = false;
// 为了让角色的移动方向与摄像机的方向一致,需要设置以下参数
GetCharacterMovement()->bOrientRotationToMovement = true;
// 这是为了使用Pawn的控制器旋转
MySpringArm->bUsePawnControlRotation = true;
}
// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
APlayerController *PlayerController = Cast<APlayerController>(GetController());
if (PlayerController)
{
UEnhancedInputLocalPlayerSubsystem *LocalPlayerSubsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer());
if (LocalPlayerSubsystem)
{
LocalPlayerSubsystem->AddMappingContext(DefaultMappingContext, 0);
}
}
}
// Called every frame
void AMyCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent *PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (UEnhancedInputComponent *EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent))
{
EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);
}
}
void AMyCharacter::Move(const FInputActionValue &Value)
{
FVector2D MoveVector = Value.Get<FVector2D>();
if (Controller != nullptr)
{
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
AddMovementInput(ForwardDirection, MoveVector.Y);
AddMovementInput(RightDirection, MoveVector.X);
}
}
void AMyCharacter::Look(const FInputActionValue &Value)
{
FVector2D LookVector = Value.Get<FVector2D>();
if (Controller == nullptr)
{
return;
}
AddControllerYawInput(LookVector.X);
AddControllerPitchInput(LookVector.Y);
}
编译之后,创建蓝图类BP_MyCharacter
这时候会有默认组件,缺少人物模型,我们可以在这里添加
添加动画蓝图类
其他设置
最后,拖到场景中,把WorldSetting -> Game Mode 设置为null
点击运行,就可以实现鼠标,键盘第三人称操作了。