当前位置:   article > 正文

UE5 C++增强输入_ue5 c++ 增强输入

ue5 c++ 增强输入

一.创建charactor,并且包含增强输入相关的头文件

1.项目名.build.cs。添加模块“EnhancedInput”,方便找到头文件和映射的一些文件。

	PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" ,"EnhancedInput","UMG"});

2.添加InputActionValue.h   EnhancedInputComponent.h  EnhancedInputSubSystems.h  GameFramework/Controller.h  GameFrameWork/SpringArmComponent.h  Camera/CameraComponent.h

  1. #include "InputActionValue.h" //输入映射Value值的头文件
  2. #include "EnhancedInputComponent.h" //增强映射的头文件
  3. #include "EnhancedInputSubsystems.h" //增强子系统的头文件
  4. #include "GameFramework/Controller.h" //输入控制器的头文件
  5. #include "GameFramework/SpringArmComponent.h" //摇臂的头文件
  6. #include "Camera/CameraComponent.h" //相机组件的头文件
  7. #include "GameFramework/CharacterMovementComponent.h" //运动组件的头文件

3.在character头文件中,添加蓝图中的通信的变量 以及 值输入映射绑定的代理函数。

  1. UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = "MySceneComponent")
  2. USpringArmComponent* MySpringArm;
  3. UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = "MySceneComponent")
  4. UCameraComponent* MyCamera;
  5. UPROPERTY(EditAnywhere,BlueprintReadOnly,Category = "Input")
  6. class UInputMappingContext* DefaultmappingContext; //输入映射上下文
  7. UPROPERTY(EditAnywhere,BlueprintReadOnly,Category = "Input")
  8. class UInputAction* MoveAction; //移动映射的变量
  9. UPROPERTY(EditAnywhere,BlueprintReadOnly,Category = "Input")
  10. class UInputAction* LookAction; //旋转映射的变量
  11. UPROPERTY(EditAnywhere,BlueprintReadOnly,Category = "MySceneComponent")
  12. UWidgetComponent* MyWidgetHealth;
  13. void Move(const FInputActionValue& Value); //所执行的代理函数绑定
  14. void Look(const FInputActionValue& Value);

二.实现相关函数

1.构造函数中,构造相机。

  1. PrimaryActorTick.bCanEverTick = true;
  2. MySpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("MySpringArmComponent"));
  3. MyCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("MyCameraComponent"));
  4. MySpringArm->TargetArmLength = 400.f;
  5. //
  6. MyCamera->SetupAttachment(MySpringArm);
  7. MySpringArm->SetupAttachment(RootComponent);//设置跟组件。

2. 设置控制器转动不影响角色,将角色运动面朝加速度。让pawn可以随着SpringArm旋转。

  1. //让控制器的转动不影响角色的转动,只影响相机的转动
  2. bUseControllerRotationRoll = false;
  3. bUseControllerRotationPitch = false;
  4. bUseControllerRotationYaw = false;
  5. GetCharacterMovement()->bOrientRotationToMovement = true; //让角色面朝加速度的方向
  6. MySpringArm->bUsePawnControlRotation = true; //这个使用了Pawn控制器的旋转

3.在BeginPlay里,将Charactor自身的控制器 转换为 APlayerController,是否合法。获得本地玩家控制器的增强输入的子系统。加入 输入映射的上下文,优先级 作为 设置到子系统的映射。

  1. Super::BeginPlay();
  2. if (APlayerController* PlayerController = Cast<APlayerController>(Controller)) //如果控制器是合法的
  3. {
  4. if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer())) //玩家控制器转换为 增强输入的本地玩家子系统
  5. {
  6. Subsystem->AddMappingContext(DefaultmappingContext,0);
  7. }
  8. }

4.获得鼠标的输入的 2D 坐标 movementVector。判断控制器是否合法,获得控制器的旋转。将Yaw的旋转在Y轴上的 X轴上的方向的投影。移动的同时,人物先转动到相机的方向。我暂时理解的就是在控制器给定的方向移动,输入的距离。

  1. void AMyCharacter::Move(const FInputActionValue& Value)
  2. {
  3. FVector2D movementVector = Value.Get<FVector2D>();
  4. if (Controller!=nullptr)
  5. {
  6. const FRotator Rotation = Controller->GetControlRotation();
  7. const FRotator YawRotation(0,Rotation.Yaw,0);
  8. const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
  9. const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
  10. AddMovementInput(ForwardDirection,movementVector.Y);
  11. AddMovementInput(RightDirection,movementVector.X);
  12. }
  13. }

5.获得鼠标的X,Y方向的移动,获得X方向上的向量值。

  1. void AMyCharacter::Look(const FInputActionValue& Value)
  2. {
  3. FVector2D LookAxisVector = Value.Get<FVector2D>(); //获得鼠标的控制器
  4. if (Controller != nullptr)
  5. {
  6. AddControllerYawInput(LookAxisVector.X);
  7. AddControllerPitchInput(LookAxisVector.Y);
  8. }
  9. }

6.玩家输入方式改为增强玩家输入映射,绑定输入(映射变量,方式,对象,绑定的函数)。

  1. // Called to bind functionality to input
  2. void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
  3. {
  4. Super::SetupPlayerInputComponent(PlayerInputComponent); //自带的设置
  5. if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent)) //执行输入的时候
  6. {
  7. EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
  8. EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);
  9. }
  10. }

7.创建继承C++的蓝图,设置Mesh。

8.设置初始化Inputmapping 上下文, 和  Action。这里用的第三人称的现成资源。

9.GameMode设置为空,测试成功。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号