基于C++代码的UE4学习(九)—— 按键输入绑定与朝向设置

 

今天解决两大问题,第一个,键盘按键与鼠标轴向在UE中的绑定。第二个,解决UE中Charactor随着相机朝向的问题。

新建一个类继承与Charactor类.

在工程设置中找到Input.

并如下设置:

 

 

 

 

在头文件中写入以下代码:

 

 

1 // Fill out your copyright notice in the Description page of Project Settings.
 2 
 3 #pragma once
 4 
 5 #include "CoreMinimal.h"
 6 #include "GameFramework/Character.h"
 7 #include "MyCharacter.generated.h"
 8 
 9 UCLASS()
10 class CHARACTOR_API AMyCharacter : public ACharacter
11 {
12     GENERATED_BODY()
13 
14 public:
15     // Sets default values for this character's properties
16     AMyCharacter();
17 
18 protected:
19     // Called when the game starts or when spawned
20     virtual void BeginPlay() override;
21 
22 public:    
23     // Called every frame
24     virtual void Tick(float DeltaTime) override;
25 
26     // Called to bind functionality to input
27     virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
28 
29 private:
30     FVector keyInput;
31     FRotator mouseInput;
32     float maxSpeed;
33     float mouseSpeed;
34     void forward(float value);
35     void right(float value);
36     void up(float value);
37     void yaw(float value);
38     void pitch(float value);
39 
40 public:
41     UPROPERTY(VisibleAnywhere,BlueprintReadOnly)
42     class UStaticMeshComponent* myStaticMesh;
43 
44     FORCEINLINE UStaticMeshComponent* GetmyStaticMesh() {
45         return myStaticMesh;
46     }
47 
48 
49     UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
50     class USpringArmComponent* mySpringArm;
51     UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
52     class UCameraComponent* myCamera;
53 };

 

 

在源文件中写入以下代码:

 

 

1 // Fill out your copyright notice in the Description page of Project Settings.
  2 
  3 
  4 #include "MyCharacter.h"
  5 #include "Components\InputComponent.h"
  6 #include "Components\StaticMeshComponent.h"
  7 #include "GameFramework\SpringArmComponent.h"
  8 #include "Camera\CameraComponent.h"
  9 #include "UObject\ConstructorHelpers.h"
 10 
 11 
 12 // Sets default values
 13 AMyCharacter::AMyCharacter()
 14 {
 15      // Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
 16     PrimaryActorTick.bCanEverTick = true;
 17     mouseInput = FRotator(0.0f);
 18     keyInput = FVector::ZeroVector;
 19     maxSpeed = 300.0f;
 20     AutoPossessPlayer = EAutoReceiveInput::Player0;
 21     mouseSpeed = 2.0f;
 22 
 23     myStaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("myStaticMesh"));
 24     mySpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("mySpringArm"));
 25     myCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("myCamera"));
 26 
 27     auto myMeshAsset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Engine/VREditor/TransformGizmo/SM_Sequencer_Key.SM_Sequencer_Key'"));
 28     auto myMatAsset = ConstructorHelpers::FObjectFinder<UMaterialInterface>(TEXT("Material'/Engine/Functions/Engine_MaterialFunctions02/ExampleContent/GradientMap_Multi_Example.GradientMap_Multi_Example'"));
 29     
 30     if (myMeshAsset.Succeeded() && myMatAsset.Succeeded()) {
 31         myStaticMesh->SetStaticMesh(myMeshAsset.Object);
 32         myStaticMesh->SetMaterial(0, myMatAsset.Object);
 33         myStaticMesh->SetMaterial(1, myMatAsset.Object); 
 34     }
 35     
 36     myStaticMesh->SetupAttachment(GetRootComponent());
 37     mySpringArm->SetupAttachment(GetmyStaticMesh());
 38     myCamera->SetupAttachment(mySpringArm);
 39 
 40     mySpringArm->bEnableCameraLag = true;
 41     mySpringArm->CameraLagSpeed = 30.0f;
 42     mySpringArm->TargetArmLength = 300.0f;
 43 
 44 
 45     myCamera->SetRelativeLocation(FVector(0.0f, 0.0f, 100.0f));
 46     myCamera->SetRelativeRotation(FRotator(-5.0f,0.0f,0.0f));
 47 
 48     //bUseControllerRotationYaw = true;
 49 
 50 }
 51 
 52 // Called when the game starts or when spawned
 53 void AMyCharacter::BeginPlay()
 54 {
 55     Super::BeginPlay();
 56     
 57 }
 58 
 59 // Called every frame
 60 void AMyCharacter::Tick(float DeltaTime)
 61 {
 62     Super::Tick(DeltaTime);
 63     
 64 
 65     auto direction_forward = myCamera->GetForwardVector();
 66     auto direction_right = myCamera->GetRightVector();
 67      68 
 69     if (keyInput.X == 1.0) {
 70         keyInput = direction_forward;
 71         keyInput *= maxSpeed;
 72     }else if (keyInput.X == -1.0) {
 73         keyInput = -direction_forward;
 74         keyInput *= maxSpeed;    
 75     }
 76 
 77     if (keyInput.Y == 1.0) {
 78         keyInput = direction_right;
 79         keyInput *= maxSpeed;
 80     }
 81     else if (keyInput.Y == -1.0) {
 82         keyInput = -direction_right;
 83         keyInput *= maxSpeed;
 84     }
 85 
 86     FHitResult hit;
 87     AddActorLocalOffset(DeltaTime * keyInput, true, &hit);
 88     
 89     FRotator Rotations = myStaticMesh->GetRelativeRotation();
 90     Rotations.Yaw += mouseInput.Yaw * mouseSpeed;
 91     Rotations.Pitch = 0;
 92     Rotations.Roll = 0;
 93     myStaticMesh->SetRelativeRotation(Rotations);
 94 
 95 
 96     //AddControllerYawInput(Rotations.Yaw);
 97         
 98 
 99     FRotator CRotator = mySpringArm->GetComponentRotation();
100     CRotator.Yaw = 0.0f;
101     CRotator.Pitch = FMath::Clamp(CRotator.Pitch + mouseInput.Pitch, -30.0f, 90.0f);
102     CRotator.Roll = 0.0f;
103     mySpringArm->SetRelativeRotation(CRotator);
104 
105 }
106 
107 // Called to bind functionality to input
108 void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
109 {
110     Super::SetupPlayerInputComponent(PlayerInputComponent);
111     PlayerInputComponent->BindAxis("forward",this, &AMyCharacter::forward);
112     PlayerInputComponent->BindAxis("right",this, &AMyCharacter::right);
113     PlayerInputComponent->BindAxis("up",this, &AMyCharacter::up);
114     PlayerInputComponent->BindAxis("yaw",this, &AMyCharacter::yaw);
115     PlayerInputComponent->BindAxis("pitch",this, &AMyCharacter::pitch);
116 
117 }
118 
119 void AMyCharacter::forward(float value)
120 {
121     
122     keyInput.X = FMath::Clamp(value, -1.0f, 1.0f);
123 }
124 
125 void AMyCharacter::right(float value)
126 {
127 
128     keyInput.Y = FMath::Clamp(value, -1.0f, 1.0f);
129 }
130 
131 void AMyCharacter::up(float value)
132 {
133     keyInput.Z = FMath::Clamp(value, -1.0f, 1.0f) * maxSpeed;
134 }
135 
136 void AMyCharacter::yaw(float value)
137 {
138     mouseInput.Yaw = FMath::Clamp(value, -1.0f, 1.0f) * mouseSpeed;
139 }
140
141 void AMyCharacter::pitch(float value) 
142 { 
143     mouseInput.Pitch = FMath::Clamp(value, -1.0f, 1.0f) * mouseSpeed; 
144 }

 

 

这里需要注意将所有的物理属性关闭,重力属性关闭。

世界重力也要关闭。

 

 

效果如下,物体朝向与摄像机一致,按键方向也与朝向一致。

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值