文章目录
- 创建Character第三人称模板
- 添加增强输入引用
- 在脚本中实现移动、旋转
创建Character第三人称模板
创建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 propertiesAMyCharacter();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:// Called every framevirtual void Tick(float DeltaTime) override;// Called to bind functionality to inputvirtual 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
点击运行,就可以实现鼠标,键盘第三人称操作了。