当前位置 博文首页 > 文章内容

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

    作者: 栏目:未分类 时间:2020-07-10 14:02:41

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    今天解决两大问题,第一个,键盘按键与鼠标轴向在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 }

     

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

    世界重力也要关闭。

     

     

     

     

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