這一篇是進行玩家移動和視角移動的介紹。
1.在玩家內進行移動覆寫
virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;
2.創建增強輸入資產的變量創建
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "CharacterData", meta = (AllowPrivateAccess = "true"))UDA_InputConfig* InputConfigDataAsset;
3.進行移動和視角移動函數的創建
void Input_Move(const FInputActionValue& InputActionValue);void Input_Look(const FInputActionValue& InputActionValue);
4.在SetupPlayerInputComponent函數內進行輸入綁定
//設置玩家輸入組件
void AXMBCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{//添加映射上下文checkf(InputConfigDataAsset, TEXT("Forgot to assign a valid data as input config"))//獲取本地玩家ULocalPlayer* LocalPlayer = GetController<APlayerController>()->GetLocalPlayer();//獲取增強輸入子系統UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(LocalPlayer);check(Subsystem);//添加映射上下文Subsystem->AddMappingContext(InputConfigDataAsset->DefaultMappingContext,0);//獲取角色輸入組件并綁定輸入動作UXMBWarriorInputComponent* WarriorInputComponent = CastChecked<UXMBWarriorInputComponent>(PlayerInputComponent);WarriorInputComponent->BindNativeInputAction(InputConfigDataAsset,XMBGameplayTags::InputTag_Move, ETriggerEvent::Triggered,this,&ThisClass::Input_Move);WarriorInputComponent->BindNativeInputAction(InputConfigDataAsset,XMBGameplayTags::InputTag_Look, ETriggerEvent::Triggered,this,&ThisClass::Input_Look);}
5.對Move函數進行設置
void AXMBCharacter::Input_Move(const FInputActionValue& InputActionValue)
{//獲取移動向量const FVector2D MovementVector = InputActionValue.Get<FVector2D>();//獲取移動旋轉const FRotator MovementRotation(0.f, Controller->GetControlRotation().Yaw, 0.f);//處理前后移動if (MovementVector.Y != 0.f){const FVector ForwardDirection = MovementRotation.RotateVector(FVector::ForwardVector);AddMovementInput(ForwardDirection, MovementVector.Y);}//處理左右移動if (MovementVector.X != 0.f){const FVector RightDirection = MovementRotation.RotateVector(FVector::RightVector);AddMovementInput(RightDirection, MovementVector.X);}}
6.對視角移動函數進行設置
void AXMBCharacter::Input_Look(const FInputActionValue& InputActionValue)
{const FVector2D LookAxisVector = InputActionValue.Get<FVector2D>();if (LookAxisVector.X != 0.f){AddControllerYawInput(LookAxisVector.X);}if (LookAxisVector.Y != 0.f){AddControllerPitchInput(LookAxisVector.Y);}
}
7.打開引擎,進入角色藍圖,細節面板搜索data,更換成自己的dataasset
#include "Character/XMBCharacter.h"
#include "Components/CapsuleComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "EnhancedInputSubsystems.h"
#include "Data/Input/DA_InputConfig.h"
#include "Components/Input/XMBWarriorInputComponent.h"
#include "XMBGameplayTags.h"#include "XMBDebugHelper.h"AXMBCharacter::AXMBCharacter()
{GetCapsuleComponent()->InitCapsuleSize(42.f, 96.f);bUseControllerRotationPitch = false;bUseControllerRotationYaw = false;bUseControllerRotationRoll = false;CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));CameraBoom->SetupAttachment(GetRootComponent());CameraBoom->TargetArmLength = 300.0f;CameraBoom->SocketOffset = FVector(0.0f, 55.0f, 60.0f);CameraBoom->bUsePawnControlRotation = true;FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);FollowCamera->bUsePawnControlRotation = false;GetCharacterMovement()->bOrientRotationToMovement = true;GetCharacterMovement()->RotationRate = FRotator(0.0f, 550.0f, 0.0f);GetCharacterMovement()->MaxWalkSpeed = 400.f;GetCharacterMovement()->BrakingDecelerationWalking = 2000.f;}void AXMBCharacter::BeginPlay()
{Super::BeginPlay();Debug::Print(FString::Printf(TEXT("XMBCharacter::BeginPlay")));
}//設置玩家輸入組件
void AXMBCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{//添加映射上下文checkf(InputConfigDataAsset, TEXT("Forgot to assign a valid data as input config"))//獲取本地玩家ULocalPlayer* LocalPlayer = GetController<APlayerController>()->GetLocalPlayer();//獲取增強輸入子系統UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(LocalPlayer);check(Subsystem);//添加映射上下文Subsystem->AddMappingContext(InputConfigDataAsset->DefaultMappingContext,0);//獲取角色輸入組件并綁定輸入動作UXMBWarriorInputComponent* WarriorInputComponent = CastChecked<UXMBWarriorInputComponent>(PlayerInputComponent);WarriorInputComponent->BindNativeInputAction(InputConfigDataAsset,XMBGameplayTags::InputTag_Move, ETriggerEvent::Triggered,this,&ThisClass::Input_Move);WarriorInputComponent->BindNativeInputAction(InputConfigDataAsset,XMBGameplayTags::InputTag_Look, ETriggerEvent::Triggered,this,&ThisClass::Input_Look);}void AXMBCharacter::Input_Move(const FInputActionValue& InputActionValue)
{//獲取移動向量const FVector2D MovementVector = InputActionValue.Get<FVector2D>();//獲取移動旋轉const FRotator MovementRotation(0.f, Controller->GetControlRotation().Yaw, 0.f);//處理前后移動if (MovementVector.Y != 0.f){const FVector ForwardDirection = MovementRotation.RotateVector(FVector::ForwardVector);AddMovementInput(ForwardDirection, MovementVector.Y);}//處理左右移動if (MovementVector.X != 0.f){const FVector RightDirection = MovementRotation.RotateVector(FVector::RightVector);AddMovementInput(RightDirection, MovementVector.X);}// if (MovementVector.Z != 0.f)// {// const FVector RightDirection = MovementRotation.RotateVector(FVector::UpVector);//// AddMovementInput(RightDirection, MovementVector.Z);// }}void AXMBCharacter::Input_Look(const FInputActionValue& InputActionValue)
{const FVector2D LookAxisVector = InputActionValue.Get<FVector2D>();if (LookAxisVector.X != 0.f){AddControllerYawInput(LookAxisVector.X);}if (LookAxisVector.Y != 0.f){AddControllerPitchInput(LookAxisVector.Y);}
}
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "InputActionValue.h"
#include "Character/CharacterBase.h"
#include "XMBCharacter.generated.h"class UDA_InputConfig;
class UCameraComponent;
class USpringArmComponent;
struct FInputActionValue;
/*** */
UCLASS()
class ARPG_GRIVITY_API AXMBCharacter : public ACharacterBase
{GENERATED_BODY()
public:AXMBCharacter();protected:virtual void BeginPlay() override;virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;private:UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))USpringArmComponent* CameraBoom;UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))UCameraComponent* FollowCamera;//UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "CharacterData", meta = (AllowPrivateAccess = "true"))UDA_InputConfig* InputConfigDataAsset;void Input_Move(const FInputActionValue& InputActionValue);void Input_Look(const FInputActionValue& InputActionValue);};