在Unreal Engine中使用C++创建基础角色并添加移动功能

embedded/2024/12/23 0:42:03/

目录

引言

步骤一:创建C++类

步骤二:编写C++代码

步骤三:设置输入绑定

步骤四:在UE编辑器中测试

结论


引言

Unreal Engine(UE)以其强大的功能和灵活性在游戏开发界广受好评。本文将指导你如何在UE中通过C++创建一个基础的游戏角色,并为其添加基本的移动功能,如前进、后退、左转和右转。我们将从创建C++类开始,编写代码以实现这些功能,并在UE编辑器中测试它们。

步骤一:创建C++类
  1. 打开Unreal Engine Editor:启动UE4或UE5编辑器。

  2. 新建C++类:在UE编辑器中,选择“File” > “New C++ Class...”。

  3. 设置类属性

    • Parent Class:选择ACharacter作为父类,因为它已经包含了基础的移动组件和动画支持。
    • Class Name:为你的类命名,例如AMyCharacter
    • Class Folder:选择或创建一个文件夹来存放你的类文件。
    • 点击“Create Class”按钮。
步骤二:编写C++代码

在生成的AMyCharacter.hAMyCharacter.cpp文件中,我们将添加代码以实现基础移动功能。

AMyCharacter.h

// Fill out your copyright notice in the Description page of Project Settings.  #pragma once  #include "CoreMinimal.h"  
#include "GameFramework/Character.h"  
#include "MyCharacter.generated.h"  UCLASS()  
class YOURPROJECTNAME_API AMyCharacter : public ACharacter  
{  GENERATED_BODY()  public:      // Sets default values for this character's properties  AMyCharacter();  protected:  // Called when the game starts or when spawned  virtual void BeginPlay() override;  public:      // Called every frame  virtual void Tick(float DeltaTime) override;  // Called for forwards/backwards input  void MoveForward(float Value);  // Called for side to side input  void MoveRight(float Value);  
};

AMyCharacter.cpp

// Fill out your copyright notice in the Description page of Project Settings.  #include "MyCharacter.h"  AMyCharacter::AMyCharacter()  
{  // 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;  // Configure character movement  GetCharacterMovement()->bOrientRotationToMovement = true; // Rotate character to face movement direction  GetCharacterMovement()->RotationRate = FRotator(0.0f, 540.0f, 0.0f); // Set the rotation rates for the character  
}  void AMyCharacter::BeginPlay()  
{  Super::BeginPlay();  // Additional initialization can be done here  
}  void AMyCharacter::Tick(float DeltaTime)  
{  Super::Tick(DeltaTime);  // This is just an example, actual input handling should be done in a PlayerController or InputComponent  // Assuming we have input values from somewhere (e.g., gamepad, keyboard)  // MoveForward(InputAxisValue);  // MoveRight(InputAxisValue);  
}  void AMyCharacter::MoveForward(float Value)  
{  if ((Controller != nullptr) && (Value != 0.0f))  {  // Find out which way is forward  const FRotator Rotation = Controller->GetControlRotation();  const FVector Direction = FRotationMatrix(Rotation).GetUnitAxis(EAxis::X);  // Add movement in that direction  AddMovementInput(Direction, Value);  }  
}  void AMyCharacter::MoveRight(float Value)  
{  if ((Controller != nullptr) && (Value != 0.0f))  {  // Find out which way is right  const FRotator Rotation = Controller->GetControlRotation();  const FVector Direction = FRotationMatrix(Rotation).GetUnitAxis(EAxis::Y);  // Add movement in that direction  AddMovementInput(Direction, Value);  }  
}

注意:上面的Tick函数中的MoveForwardMoveRight调用只是示例,实际上你通常会在SetupPlayerInputComponent函数中设置这些输入绑定,或者在你的PlayerController类中处理输入。

步骤三:设置输入绑定

AMyCharacter类中,我们需要重写SetupPlayerInputComponent函数来设置输入绑定。这个函数会在角色被创建时自动调用,以配置如何响应玩家的输入。

修改AMyCharacter.h

AMyCharacter类的声明中添加对SetupPlayerInputComponent函数的声明(如果尚未存在):

// ...  
protected:  // Function to bind player inputs  virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;  
// ...

修改AMyCharacter.cpp

实现SetupPlayerInputComponent函数:

void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)  
{  Super::SetupPlayerInputComponent(PlayerInputComponent);  // Bind axis movements to our custom functions  PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);  PlayerInputComponent->BindAxis("MoveRight", this, &AMyCharacter::MoveRight);  // Optionally, bind keys or buttons for specific actions  // PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AMyCharacter::Jump);  
}

请注意,上面的"MoveForward""MoveRight"是输入轴(Axis)的名称,这些名称应该与你在UE编辑器中设置的输入轴名称相匹配,或者你可以在这里定义它们(尽管通常在项目的Project Settings -> Input中预先定义)。

步骤四:在UE编辑器中测试
  1. 编译你的项目:在UE编辑器中,点击“Compile”按钮来编译你的C++代码。

  2. 放置角色到场景中:在UE编辑器的内容浏览器中,找到你的AMyCharacter类,然后将其拖放到关卡编辑器中的场景中。

  3. 配置输入:如果你还没有在Project Settings -> Input中设置输入轴,现在需要设置。为"MoveForward""MoveRight"设置合适的输入设备(如键盘或游戏手柄)和按键/摇杆。

  4. 播放关卡:点击编辑器工具栏上的“Play”按钮来运行你的关卡,并测试你的角色是否按预期移动。

结论

通过上述步骤,你应该已经成功在Unreal Engine中使用C++创建了一个基础的游戏角色,并为其添加了基本的移动功能。这只是UE中C++编程的一个起点,你可以继续探索更复杂的角色行为、物理交互、AI控制等高级功能。


http://www.ppmy.cn/embedded/97003.html

相关文章

CSS3-新特性

1.新增选择器 1.属性选择器 2.结构伪类选择器 3.伪元素选择器(重点) 4.CSS3 盒子模型 2.CSS3滤镜filter 3.CSS3 calc 函数 4.CSS3 过渡(重点)

ISIS中间系统到中间系统

1.IS-IS概述 中间系统到中间系统路由协议、数据链路层协议(Eth:Type:0x8000),安全性高。 设计于OSI/RM,后续对TCP/IP进行兼容性改进,成为集成式IS-IS。收敛速度快、扁平化部署、兼容性及可扩展性强、适用于运营商(骨干)网络。无类路由协议、…

Spring Boot Controller 最佳实践

随着微服务架构的普及,RESTful API已经成为现代Web服务的标准设计模式。Spring Boot为开发者提供了强大的工具来快速构建RESTful服务。本文将探讨如何利用Spring Boot的最佳实践来设计高效且一致的控制器。 1. RESTful接口地址的定义规则 RESTful API设计的核心在…

Ubuntu下提升高并发socket最大连接数限制

文章目录 前言1. limits.conf修改2. /etc/pam.d修改3. /etc/sysctl.conf修改4. ulimit设置5.重启系统即可生效参考文档 前言 linux系统默认ulimit为1024个访问 用户最多可开启的程序数目。一般一个端口(即一个进程)的最高连接为2的16次方65536。 查看全…

Camera基础知识系列(3)——光圈

目录 一. 引言 二. 光圈 2.1. 入瞳孔\出瞳孔 入瞳孔 出瞳孔 2.1 f值 f值的由来 常见的f值 2.2 .变焦镜头光圈 三. 光圈影响什么 四. 总结 一. 引言 摄影中,光圈是一个很重要的元素,值得单独为它列一章出来讲。光圈的调整对于摄影来说非常…

Nvidia AI 发布 Llama-Minitron 3.1 4B:通过修剪和提炼 Llama 3.1 8B 构建的新语言模型

Nvidia 刚刚发布了语言模型的新版本,不过这次是一个小型语言模型:Llama-3.1-Minitron 4B 模型。这意味着它是语言模型不断发展的重要步骤之一,通过剪枝和知识提炼等尖端技术,将大型模型的效率与小型模型相结合。 Llama-3.1-Minitr…

数据结构之排序(下)

片头 嗨!小伙伴们,咱们又见面啦,在上一篇数据结构之排序(上)中,我们学习了直接插入排序、冒泡排序和希尔排序,今天我们继续学习排序这一块,准备好了吗?Ready Go ! ! ! 一、选择排序 1.1 基本思…

大数据开发工程师面试整理-什么是大数据?

大数据是指无法通过传统的数据处理工具或方法来捕捉、管理和处理的海量数据集。通常,大数据具有以下几个关键特征,常被称为大数据的“5V”特性: 1. Volume(数据量): ● 大数据的最明显特征是其数据量非常大,通常以TB(TeraBytes,兆兆字节)甚至PB(PetaBytes,千万亿字…