【新手必读】Unreal Engine 4 C++入门教程(上)

本教程介绍了如何在Unreal Engine 4中使用C++创建游戏角色类,包括设置静态网格、弹簧臂和摄像机组件,并通过蓝图为变量和函数添加编辑器可见性。此外,还讲解了如何创建基于C++的蓝图子类,以及如何在编辑器中设置网格和调整摄像机视角。通过这个教程,开发者可以学习到在Unreal Engine中结合C++和蓝图进行游戏开发的基本步骤。
摘要由CSDN通过智能技术生成

原文|《Unreal Engine 4 C++ Tutorial》
作者|Tommy Tran Feb 6 2018 | 翻译 开发游戏的老王
阅读时长|25分钟 内容难度|入门
在本教程中,你将学会如何创建C++类并且对编辑器暴露变量和函数

在Unreal Engine 4中用蓝图创建游戏逻辑(gameplay)是非常流行的方式。然而,如果你是位资深码农或者偏爱写代码,那么你应该用C++!使用C++的话你甚至还可以修改引擎或开发自己的插件!

在本教程中,我们将会学到:

  • 创建C++类
  • 添加组件(component)并将它们暴露给蓝图
  • 基于C++类创建蓝图类
  • 添加变量并使它们在蓝图中可编辑
  • 将轴(axis)和事件(action)与函数绑定
  • 在蓝图中重写C++函数
  • 将重叠事件(overlap event)与函数绑定

注意,本文并非一个C++教程,而是针对在Unreal Engine环境中如何使用C++的教程。

开始吧

译者注: 本教程提供了范例工程,如果需要可以到原文网站免费注册并下载。

如果你还没有安装Visual Studio,请按照Epic官网引导安装并设置Visual Studio。(尽管你可以使用其它的IDE,但本教程将会使用Visual Studio,因为Unreal Engine和它有良好的兼容性)

下载并解压范例工程。在项目文件夹内打开 CoinCollector.uproject。如果出现重新构建模块(rebuild modules)的提示,点击Yes
在这里插入图片描述

完成之后,我们可以看到如下场景:

在这里插入图片描述
本教程中,我们将创建一个由玩家控制的球来收集金币。在先前的教程中,我们一直在蓝图里创建由玩家控制的角色。本教程中,我们用C++创建一个!

创建C++类

在内容浏览器(Content Browser)选择Add New\New C++ Class 来创建C++类。

在这里插入图片描述

这样C++类创建向导将被打开。首先,我们要选择它的基类。由于这个类需要被玩家控制,我们需要Pawn作为它的基类。选择Pawn点击Next

在这里插入图片描述
在下一个界面,我们可以为.h 和 .cpp文件指定名字和路径。将Name改为BasePlayer 点击Create Class

在这里插入图片描述

引擎会为我们创建文件并编译项目。编译之后,引擎会为我们打开Visual Studio。如果BasePlayer.cppBasePlayer.h没打开,请到Solution Explorer中Games\CoinCollector\Source\CoinCollector 目录下将它们打开。

在这里插入图片描述

在继续下文之前,我们要先了解一下虚幻的反射系统(reflection system)。该系统是诸如细节面板(Details panel)、垃圾回收(garbage collection)等很多引擎模块实现的基础。当我们使用C++类创建向导创建类的时候,引擎会把以下3行代码放到头文件中:

  1. #include "TypeName.generated.h"
  2. UCLASS()
  3. GENERATED_BODY()

引擎需要这三行代码,使一个类对反射系统可见。如果这些你不太理解,别着急。只要知道反射系统允许你将函数以及变量等暴露给蓝图和编辑器就可以了。

你可能已经注意到了,刚才我们创建的类被命名为ABasePlayer而不是BasePlayer。当创建一个actor类型(actor-type)的类(译者注:即Actor的子类,Pawn也是Actor的子类)时,虚幻会为类名添加一个前缀(prefix)A(即Actor的开头字母)。反射系统要求类一定要有相应的前缀,才能够正常工作。关于其它前缀可以阅读。Epic官方文档《Coding Standard》

注意: 前缀并不会显示在编辑器中。例如,如果我们想创建一个类型为ABasePlayer的变量,那么应该搜索BasePlayer

以上就是目前所需关于反射系统的全部知识。接下来,我们将添加一个角色模型和摄像机。这时,我们就要用到组件(component)

添加组件

对于Pawn,我们需要添加3个组件:

  1. Static Mesh: 静态网格组件,该组件允许我们选择一个网格模型来代表角色
  2. Spring Arm: 升降臂组件,这个组件类似于摄像机的升降臂。一端连接模型,另一端连接摄像机。
  3. Camera: 摄像机组件, 虚幻将把摄像机拍摄到的一切展现给玩家。

首先,我们要包含每个组件的头文件。打开BasePlayer.h 然后在#include "BasePlayer.generated.h"上面添加如下代码:

#include "Components/StaticMeshComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"

注意: 一定要确保 .generated.h文件在最后被包含。本例中,我们包含的头文件应该如下样式:

#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "Components/StaticMeshComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"
#include "BasePlayer.generated.h"

如果 .generated.h没有在最后,那么编译时将会报错。

现在,我们为每个组件声明变量。请在SetupPlayerInputComponent()下面添加如下代码:

UStaticMeshComponent* Mesh;
USpringArmComponent* SpringArm;
UCameraComponent* Camera;

这里的变量名将会呈现在编辑器中。本例中,组件将会显示为Mesh, SpringArmCamera

接下来,我们要使每个变量对反射系统可见。为每个变量添加一个UPROPERTY()。我们的代码将会如下样式:

UPROPERTY()
UStaticMeshComponent* Mesh;

UPROPERTY()
USpringArmComponent* SpringArm;

UPROPERTY()
UCameraComponent* Camera;

我们还可以在UPROPERTY()中添加分类符(specifier),它们会在引擎不同的功能方向上控制变量的行为。

在每个UPROPERTY()的括号中添加VisibleAnywhereBlueprintReadOnly,每个分类符之间要加逗号。

UPROPERTY(VisibleAnywhere, BlueprintReadOnly)

VisibleAnywhere将允许每个组件对编辑器和蓝图可见。
BlueprintReadOnly将允许我们使用蓝图节点获取(get)组件的引用,但是不允许对其修改(set)。将组件设为只读(read-only )非常重要,因为它们的变量实际上都是指针。我们不能允许用户修改它,否则它们可能随机指向某一块内容。注意,BlueprintReadOnly依然允许我们修改组件中的变量,这一点也是我们所期望的。

注意: 如果是诸如int, float, boolean等非指针类型变量(non-pointer variables),我们会使用EditAnywhereBlueprintReadWrite分类符。

现在,我们为每个组件创建了变量,接下来就要对它们进行初始化。这项工作,将在 构造函数( constructor) 中完成。

组件初始化

我们可以使用CreateDefaultSubobject<Type>("InternalName")创建组件的实例。打开BasePlayer.cpp并在ABasePlayer() 函数中添加如下代码:

Mesh = CreateDefaultSubobject<UStaticMeshComponent>("Mesh");
SpringArm = CreateDefaultSubobject<USpringArmComponent>("SpringArm");
Camera = CreateDefaultSubobject<UCameraComponent>("Camera");

上述代码会创建每个类型的组件。并且让每个变量指向组件的内存地址。字符串参数是引擎需要使用的组件内部名称(internal name),而并非显示在编辑器和蓝图中的名字(尽管本例中它们是相同的)。

接下来,我们要搭建层级(hierarchy),所谓层级就是设置诸如那个组件是 根(Root) 组件 的工作。在先前代码的后面添加如下代码:

RootComponent = Mesh;
SpringArm->SetupAttachment(Mesh);
Camera->SetupAttachment(SpringArm);

第一行代码将Mesh设为Root 组件。第二行代码将SpringArm添加到Mesh上,作为其子组件。第三行代码将Camera添加到SpringArm上,作为其子组件。

现在组件的代码已经完成,我们需要编译一下。使用下面的方法之一进行编译即可:

  1. 在Visual Studio中选择Build\Build Solution
  2. 在虚幻引擎的工具栏上选择Compile

接下来,我们需要设置网格并且要旋转spring arm一下。我们还是建议使用蓝图做这项工作,因为你肯定不愿意用硬编码的方式指定资源路径。比如,在C++中,如果我们需要设置static mesh,那就要照下面的样子做:

static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshToUse(TEXT("StaticMesh'/Game/MyMesh.MyMesh");
MeshComponent->SetStaticMesh(MeshToUse.Object);

然而在蓝图中,我们可以直接在下拉列表中选择网格。

在这里插入图片描述

如果我们把(模型)资源移动到其它文件夹,我们的蓝图不会崩溃,然而在C++中,我们必须修改每一处引用该资源的代码。

在蓝图中设置完网格和升降臂的旋转,我们将创建一个基于BasePlayer的蓝图类。

注意: 常用的工作流程是在C++中创建基类(base class)然后创建蓝图子类(subclass)。这种方式便于诸如美工和策划等角色编辑类。

创建子类

在引擎中,找到Blueprints文件夹,并创建蓝图类(Blueprint Class),展开All Classes 部分,并搜索 BasePlayer,选择 BasePlayer并点击选择。

在这里插入图片描述

将蓝图类更名为BP_Player 并打开。

首先,我们要设置网格模型。选择Mesh组件并将它的Static Mesh 设为SM_Sphere

在这里插入图片描述

接下来,我们将设置升降臂的旋转和长度。我们的游戏是一个俯视角游戏,因此摄像机要在角色的上方。

选择SpringArm组件将Rotation设为**(0, -50, 0)**。这样旋转升降臂使摄像机自顶向下朝向网格。

在这里插入图片描述

由于升降臂使网格的子组件,当球旋转时它也会旋转。

在这里插入图片描述

我们要将升降臂的旋转设为absolute以修复这个问题。点击Rotation旁的箭头,并选择World

在这里插入图片描述

然后将Target Arm Length设为1000。这样摄像机将会被放置于距网格1000个单位远的位置。

在这里插入图片描述

接下来,我们将把默认的Pawn类设为我们的Pawn。点击编译,然后回到编辑器。打开World Settings 并将Default Pawn 设为BP_Player

在这里插入图片描述

点击Play,来看看我们游戏中的Pawn。

在这里插入图片描述
接下来是添加让角色移动的函数。

### 回答1: 学习使用虚幻引擎4构建游戏的方式是通过实践编写游戏来学习C语言。虚幻引擎4是一种强大的游戏开发工具,提供了丰富的功能和工具,方便开发者进行游戏开发。 通过使用虚幻引擎4作为学习工具,学生可以将编写代码与实际游戏开发结合起来,加深对C语言的理解。从创建游戏场景、添加角色和物体、设计游戏逻辑等方面进行实际编码,可以使学生更好地理解编程概念和语法。 使用虚幻引擎4进行游戏开发还可以激发学生的创造力和想象力。学生可以利用引擎中丰富的资源库,包括各种角色、场景和音效,来创建自己的游戏世界。他们可以设计自己的游戏规则和关卡,实现自己的游戏想法。 此外,通过构建游戏,学生还可以学习到游戏开发的整个流程,包括项目管理、协作和测试等方面。他们将面临各种开发挑战,并学会解决问题和调试代码。 总之,通过使用虚幻引擎4构建游戏来学习C语言,学生不仅能够掌握编程技巧,还能在创意和设计方面得到锻炼。这种学习方式不仅能够提高学生的编程能力,还能激发他们对游戏开发的兴趣,并为未来进一步深入学习游戏开发打下坚实的基础。 ### 回答2: 《通过使用虚幻引擎4构建游戏学习C语言》是一本教你如何通过使用虚幻引擎4来构建游戏并学习C语言的书籍。这个教程从基础知识开始,向读者介绍了C语言的基本概念、语法和编程原则。通过学习这本书,读者可以了解如何使用C语言来开发虚幻引擎4中的游戏。 这本书以构建游戏作为学习C语言的主题是非常巧妙的。通过实际动手的方式,读者可以将理论知识应用到实践中,加深对C语言的理解和掌握。而虚幻引擎4作为一款流行的游戏开发引擎,具有强大的功能和广泛的应用,将帮助读者更好地理解C语言在游戏开发中的应用。 本书的内容涵盖了虚幻引擎4的基本概念和工具,包括游戏世界的创建、角色控制、动画效果、碰撞检测等。读者将学习如何使用C语言编写代码来实现这些功能,并通过实际示例进行实践。通过阅读和完成书中的练习,读者将逐步提高他们的编程技能,并对游戏开发有更深入的了解。 这本书还适合那些有一定编程基础但想扩展他们的技能并进一步了解游戏开发的读者。通过结合C语言和虚幻引擎4,读者将能够学习到如何开发高质量和功能强大的游戏。同时,本书也提供了许多实用的技巧和建议,帮助读者解决在游戏开发过程中可能遇到的问题。 总之,通过使用虚幻引擎4构建游戏来学习C语言是一种创新和有趣的方式。这本书不仅能够帮助读者系统地学习C语言的知识,还能让他们在实践中提高自己的编程技能。无论是对于初学者还是有经验的开发者来说,这本书都是一个值得推荐的资源。 ### 回答3: 通过使用虚幻引擎4构建游戏学习C语言 《通过使用虚幻引擎4构建游戏学习C语言》是一本教程式书籍,旨在帮助读者通过动手实践游戏开发来学习C语言。本书借助强大的虚幻引擎4提供的开发环境,让读者能够充分了解和掌握C语言的相关知识。 通过构建游戏来学习C语言具有多重优势。首先,游戏开发是一个非常具有趣味性的项目。与枯燥的理论学习相比,通过动手实践游戏开发,读者可以更好地专注于学习过程,更易于融会贯通。其次,虚幻引擎4是一款广泛应用于游戏开发的强大软件,它提供了丰富的功能和工具,帮助读者更好地理解和应用C语言。 在这本书中,读者将逐步了解C语言的基础知识,并学习如何在虚幻引擎4中应用这些知识来构建游戏。书中通过一系列的实例和案例,引导读者学习如何使用C语言编写游戏逻辑和脚本,如何创建人物角色、场景和动画等。读者将掌握如何使用虚幻引擎4的资源管理系统、物理引擎和图形渲染技术等关键功能,以及如何在游戏中实现交互、音效和视觉效果。 通过学习C语言,读者将能够理解计算机编程的基本原理和概念,并掌握一种常用的编程语言。而通过结合虚幻引擎4的游戏开发,读者将更深入地了解游戏设计和开发的流程,同时也可以提升自己在游戏开发领域的技能和竞争力。 总而言之,《通过使用虚幻引擎4构建游戏学习C语言》是一本既有趣又实用的教材,它为想要学习C语言并对游戏开发感兴趣的读者提供了一个很好的机会和平台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值