加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

UE4设定人物移动和与人物视角

发布时间:2023-06-17 10:01:04 所属栏目:语言 来源:
导读:这一节我们来设置默认的角色和控制器和默认地图不一样,默认角色和控制器需要设置在 GameMode 里面。

1) 打开 VS 编辑器, 打开“APlayingGameModeBase.h”文件,声明一个构造函数:

2) 在“AP
这一节我们来设置默认的角色和控制器和默认地图不一样,默认角色和控制器需要设置在 GameMode 里面。

1) 打开 VS 编辑器, 打开“APlayingGameModeBase.h”文件,声明一个构造函数:

2) 在“APlayingGameModeBase.cpp”文件中创建构造函数实现,然后在 #include "PlayingGameModeBase.h" 头文件的下面添加 #include "PlayingController.h"  和 #include "PlayingCharacter.h" 头文件。

3) 在构造函数中添加以下代码:

对代码的说明:
DefulatPawnClass 是我们进入地图的时候默认控制的角色;
PlayerControllerClass 是我们进入地图的时候默认的角色控制器。

这样,我们就设置好了默认角色和默认控制器.然后我们编译一下,编译好了之后我们在 UE4 编辑器里面点击Play,我们会发现视口被锁定了无法移动,那是因为我们还没有写视角和移动的逻辑,下一节将会实现这些功能。

a本节我们先讲解 UE4 人物移动的设置,然后再讲解 UE4 人物视角的设置。
UE4 设置人物移动
1) 打开 UE4 编辑器,点击“编辑”然后点击“项目设置”:

2) 选择“输入”:

3) 点击“AxisMappins” 的  添加按键输入,我们创建 6 个按键输入:

4) 更改按键和按键的名字,这里一个按键对应一个名字。你可以通过添加多个名字不同但是按键相同的方法去绑定不同的事件。

5) 设置完成后,我们打开 VS 编辑器,在“PlayingCharacter.h”文件下声明 4 个函数:

这四个函数就是我们要实现移动功能的函数,我们来到 .cpp 文件去实现这四个函数
void APlayingCharacter::MoveForward(float val)
{
    AddMovementInput(GetActorForwardVector(), val);
}
void APlayingCharacter::MoveBack(float val)
{
    AddMovementInput(-GetActorForwardVector(), val);
}
void APlayingCharacter::MoveRight(float val)
{
    AddMovementInput(GetActorRightVector(), val);
}
void APlayingCharacter::MoveLeft(float val)
{
    AddMovementInput(-GetActorRightVector(), val);
}
AddMovementInput() 这个函数会根据第一个参数的值去移动角色,第二个参数是个浮点数,如果这个数是 1 的话,那么它会按照第一个参数的方向去添加,如果第二个参数是 -1 的话,那么会往第一个参数的反方向去添加。

那么这个 val 变量的值怎么来的呢,它在我们设置按键输入的时候就已经设定好了,默认值是 1。

GetActorForwardVector() 是在世界空间中从此 A 角色获取前向的向量,它获取的是 X 轴的向量。
GetActorRightVector()   同上,它获取的是 Y 轴的向量。

写好这 4 个函数之后,我们还要进行按键绑定,把我们的函数和我们的按键绑定在一起。

在“SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)”函数里,我们添加 4 个按键绑定。

InputComponent 是一个组件,它用来绑定按键输入。

第一个参数要和我们当初设置按键绑定的名字要一样,第二个参数是一个指针类型,我们直接给 this,第三个参数就是我们要绑定的函数。
UE4 设置人物角色
我们同样在  SetupPlayerInputComponenet 函数中写入我们控制视角的代码。

AddControllerYawInput() 和 AddControllerPitchInput() 是 UE4 已经为我们封装好的移动视角的函数。
FRotator
Yaw 表示 摇头 就是绕 Z 移动;
Pich 表示 点头 就是绕 Y 移动;
Roll 你可以想象成左右晃脑,绕 X轴运动。

这三个变量组成了 UE4 里面所有物体的旋转方向,它是一个结构体叫 FRotator。

写完上面的代码后,点击编译,回到 UE4 点击 Play,我们会发现人物可以前后左右移动和左右上下看。

完整代码:
纯文本复制
APlayingCharacter.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "PlayingCharacter.generated.h"
UCLASS()
class GAMEPROJECT_API APlayingCharacter : public ACharacter
{
    GENERATED_BODY()
public:
    // Sets default values for this character's properties
    APlayingCharacter();
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;
    void MoveForward(float val);//人物往前移动
    void MoveBack(float val);    //人物向后
    void MoveRight(float val);    //人物向右
    void MoveLeft(float val);    //人物向左
};
APlayingCharacter.Cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "PlayingCharacter.h"
// Sets default values
APlayingCharacter::APlayingCharacter()
{
     // 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;
}
// Called when the game starts or when spawned
void APlayingCharacter::BeginPlay()
{
    Super::BeginPlay();
   
}
// Called every frame
void APlayingCharacter::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}
// Called to bind functionality to input
void APlayingCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);
    InputComponent->BindAxis("MoveForward", this, &APlayingCharacter::MoveForward);
    InputComponent->BindAxis("MoveBack", this, &APlayingCharacter::MoveBack);
    InputComponent->BindAxis("MoveRight", this, &APlayingCharacter::MoveRight);
    InputComponent->BindAxis("MoveLeft", this, &APlayingCharacter::MoveLeft);
    InputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
    InputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
}
void APlayingCharacter::MoveForward(float val)
{
    AddMovementInput(GetActorForwardVector(), val);
}
void APlayingCharacter::MoveBack(float val)
{
    AddMovementInput(-GetActorForwardVector(), val);
}
void APlayingCharacter::MoveRight(float val)
{
    AddMovementInput(GetActorRightVector(), val);
}
void APlayingCharacter::MoveLeft(float val)
{
    AddMovementInput(-GetActorRightVector(), val);
}

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章