赞
踩
创建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
点击运行,就可以实现鼠标,键盘第三人称操作了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。