UE4C++游戏开发入门教程!(第一期)
学习ue4 c++可以更好理解ue4,但需要已经了解或掌握至少以下两点:
- 已有编程经验
- 了解蓝图
所以可以先学一下蓝图类的教程,对ue4的整体有个了解后再来学习c++。
环境安装
ue4编写c++,除了安装ue4外,还需要安装visual studio 2019或者安装visual studio code等开发环境。首次在ue4中选择创建c++类时,会提示安装visual studio,你可以选择vs2019 commit安装,安装完成后配置参考:
《设置虚幻引擎到Visual Studio工作流前》
《Unreal Engine4 - visual studio 智能提示》
vs安装提示:
《UnrealVS扩展》
ue4自带扩展,位置比如:C:\Program Files\Epic Games\UE_4.25\Engine\Extras\UnrealVS\VS2019\UnrealVS.vsix
创建一个c++项目
UE4C++游戏开发入门教程!(第一期)
-
随时使用ue4上的
编译
或compile
进行热编译,在老版本的ue4中,即便vs中进行了编译,在ue4里仍旧要进行一次编译
每次修改完c++就选择一下编译。
-
c++代码里的
.h
、.cpp
分别用于定义和实现
-
创建的c++类,默认方法与蓝图类中的默认事件一一对应
-
蓝图类中的construction script相当于c++中的构造函数
必须了解的C++小知识
这些小知识的主要目的是为了让初学者能明白代码和虚幻引擎间的关系,真正深入了解还是要静下心好好学习。
1. 通用的概念
《C++ 教程》
指针、条件语句、变量、常量、函数、类等等是编程最基本的概念,这些内容请先行了解。
2. include包含文件
<>
表示引入c++自带的文件""
表示引入自定义的文件
#include <iostream.h>
#include "SphereBase.generated.h"
3. .h
头文件,.cpp
源文件
.h
头文件:head缩写,作用相当于书的目录.cpp
源文件:C++,即C plus plus 缩写,作用相当于书的具体内容
4. 声明
、定义
、实现
三个术语
- 头文件里一般是“
声明
”,只用来说明类型和名字; - 源文件里是“
定义
”,用来设定变量和函数、分配存储空间等; - “
实现
”,就是正儿八经调用、使用这个类了。
5. 父类、子类、基类、派生类、继承
看字面意思就知道是层层递进的关系,父生子,父就是基,子就是派生,子继承了父的属性、方法等等。
对于UE4而言,虚幻引擎编了一堆游戏开发需要的基类,开发人员以基类的规则为参照,写自己的子类。
super是父类别名《UE4 C++ Super类型》
6. 虚函数
《C++虚函数详解》
在函数前加上virtual
就变成了虚函数,其目的是为了允许用基类的指针来调用子类的这个函数
,把它理解成为了提高执行效率就行了。
如果纯虚函数只做了声明,没有定义,那么就会报错。
7. 构造函数 & 析构函数
《c++构造函数详解(傻子都能看懂)》
《c++ 构造函数详解》
就是为了初始化的,写法是函数名与类名相同,当然,一个类里可以有多个构造函数,调用的时候根据参数数量写就可以了。
有了构造这种用来初始化的函数,那么就有负责撤销和清理工作的析构函数。
8. 关键字override
《C ++ 学习——关键字override》
《C++11 override》
主要目的就是防止忘记重写虚函数。
而我们写的派生类往往都是基于虚幻引擎的基类,那么用上关键字override
来尽可能减少出错。
比如派生类中写错了虚函数名,又正好没有override,那么这个写错名字的函数就作为新的函数使用了,而不是基类要求的那个函数
9. 宏
因为我们是进行UE4的C++开发,很多地方利用宏可以将c++和虚幻引擎更好更快地结合。
10. 模板
-
案例为模板类:
《c++中的template理解》
《C++模板(关键字template,typename)介绍》 -
案例为模板函数
《C++函数模板声明和实现》
《C++函数模板与类模板》
利用模板将相似功能的函数或类用在多个不同类型的地方,也就是编写函数的时候不再需要考虑类型,增强函数的重用性。
11. public
、protect
、private
的用法
《C++中关于public、protect、private的访问权限控制》
- public:外部代码可以随意访问
- protect:外部代码无法通过该子类访问基类中的public
- private:告诉编译器从基类继承的每一个成员都当成private,即只有这个子类可以访问
代码实例:
在后面几课将会遇到下面类似的代码,这样你就都能看懂是啥东西了。
格式为c++规定,比如继承用:
、定义类函数用::
头文件.h
UCLASS()
// ASphereBase派生类继承自APawn基类
class TEST1_API ASphereBase : public APawn
{
...
public:
// 声明构造函数,用于初始化
ASphereBase();
// 利用宏UPROPERTY将变量A公开到虚幻引擎中
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PropertyTest1")
// 声明变量A
float A;
// 利用宏UFUNCTION将函数InputText公开到虚幻引擎中
UFUNCTION(BlueprintCallable)
// 声明函数InputText
void InputText(int32 num);
protected:
// 声明一个纯虚函数,且要求必须重写覆盖
virtual void BeginPlay() override;
...
};
源文件.cpp
// 引入头文件
#include "SphereBase.h"
// 定义ASphereBase类的构造函数
ASphereBase::ASphereBase()
{
// 初始化属性的值为true
PrimaryActorTick.bCanEverTick = true;
// 使用模板函数CreateDefaultSubobject,显示转换形参类型为UStaticMeshComponent
SphereMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("SphereBaseCustom"));
// 调用方法
SphereMesh->SetSimulatePhysics(true);
}
// 定义InputText函数
void ASphereBase::InputText(int32 num)
{
// 调用虚幻引擎自带的方法
GEngine->AddOnScreenDebugMessage(-1, 5, FColor::White, FString::FromInt(num));
}
// 定义ASphereBase类的BeginPlay函数,纯虚函数因为这里被定义了,所以编译的时候就不会出错了
void ASphereBase::BeginPlay()
{
// super表示父类,调用父类的方法
Super::BeginPlay();
}
...