[玩转UE4/UE5动画系统>C++篇>C++基础] 之 C++版模板中那些琐碎而又应知应会的语法知识小结(本文献给刚学完谭浩强就来啃UEC++的同学)
Posted 开发游戏的老王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[玩转UE4/UE5动画系统>C++篇>C++基础] 之 C++版模板中那些琐碎而又应知应会的语法知识小结(本文献给刚学完谭浩强就来啃UEC++的同学)相关的知识,希望对你有一定的参考价值。
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏《玩转UE4/UE5动画系统》。教程中使用的资源及工程将以开源项目的形式更新到GitHub:玩转UE4上。
工程文件: 玩转UE4(GitHub)
文章目录
前言
在开始玩转UE4/UE5动画系统系列教程C++部分的教程之前,老王简单总结了虚幻C++版项目模板代码中的一些语法知识点。本文主要面向有一定C++基础(大约是大学学过C++,考试成绩60分左右)并且想使用C++开发虚幻项目的初学者。以下内容均为简要介绍以及一些使用小建议,目的是让初学者新建一个虚幻C++以后,看到项目中的代码不至于云里雾里。我为每个语法点提供了关键字,以供有进一步学习需求的朋友查询相关资料。
语法知识
下面的代码都取自于引擎自动生成的C++模板中XXXXCharacter.h和XXXXCharacter.cpp。
#pragma once是干嘛的?
关键字:
重复编译
简介:
当该头文件被其它源文件多次包含时,#pragma once可以防止编译器对该头文件的重复编译。
小建议:
在你的每个头文件第一行写上
#pragma once
。
UCLASS()是干嘛的?
关键字:
UCLASS
简介:
UCLASS是虚幻的宏,它固定放置在类的声明上部,只有派生自UObject的类(虚幻类)才可以用UCLASS标记。在一个类标记了UCLASS就意味着该类对象的垃圾回收、引用更新等机制交由虚幻引擎管理。
小建议:
阅读官方文档《对象》,并按照虚幻的设计规范合理使用。
GENERATED_BODY()是干嘛的?
关键字:
GENERATED_BODY
简介:
新建一个虚幻类以后一般会由代码生成系统自动在类声明的内部添加一行
GENERATED_BODY()
宏代码。编译的时候会自动替换成所需代码。
小建议:
别删除也别动,在
GENERATED_BODY()
的下方填充你的代码。
UPROPERTY是干嘛的?
关键字:
反射系统、UPROPERTY、UFUNCTION《对象》
简介:
UPROPERTY叫做属性声明宏,虚幻C++在标准C++基础之上实现了一套反射系统(Reflection System),反射系统负责垃圾回收、引用更新,编辑器集成等一系列高级且有用的功能。而UPROPERTY的作用就是声明该属性在反射系统系统的行为。比如上面例子中的UPROPERTY就是告诉反射系统:“下面的
CameraBoom
和FollowCamera
在编辑器的属性窗口可见,但不能被编辑,在蓝图中只读,在编辑器中显示在Camera类别,并且当它是private时在蓝图中依然可访问”。和UPROPERTY类似的还有UFUNCTION函数声明宏。
小建议:
阅读官方文档《UPROPERTY》、《UFUNCTION》以及《对象》,并按照虚幻的设计规范合理使用。
FORCEINLINE是干嘛的?
关键字:
强制内联
简介:
FORCEINLINE是一个标记强制内联命令的宏。内联是C++编译优化的一种方式,其原理就是将函数“复制”到被调用的地方,这样就削减了函数入栈出栈等一系列操作所需的消耗。但是体积庞大或者运算复杂的函数并不建议使用内联。
小建议:
如果你的函数只是像上面那样简单的返回一个值或者成员变量,那么用FORCEINLINE就对了。
类型前面的class关键字是干嘛的?
class关键字最常规的用法是声明一个类,然而用在类似下面的地方就有点让人迷糊了。
关键字:
前置声明
简介:
class的这种用法是C++的常用技巧,叫做前置声明( Forward Declarations),其实就是告诉编译器:“这个类型我先不包含它的头文件了,您先别着急,后面类的定义里调用它的时候我一定补上!” 。这种技巧可以让当前头文件暂时不包含该类型的头文件,从而为头文件树瘦身并且有效地避免了头文件的循环包含。
小建议:
这个技巧仅在头文件中适用,如果你的声明中仅使用了某个类的类型声明某个变量或返回值,那么在头文件中无须包含该类的头文件,仅用 class声明即可,但是不要忘了在cpp中包含它的头文件。
check()是干嘛的?
关键字:
断言、assert
简介:
用于检验程序运行时错误的一种方式。当check()中的表达式为false时,程序会停止运行。check()默认仅在Debug版本中有效,在Release版中无效。断言一般不用于逻辑上的判断,而是用于类似组件对象获取失败这样严重的系统问题时才用。
小建议:
阅读官方文档《断言》,并合理使用。
什么是函数回调
关键字:
函数回调
简介:
传统的函数调用逻辑是FuncA调用FuncB,FuncB再调用FuncC这样直截了当,但有些时候我们并不清楚一个函数该何时调用,比如:当玩家按下空格键时,调用发射炮弹的函数。这时我们需要把发射炮弹的函数注册给玩家按下空格键这个事件,然后当发生玩家按下空格键这个事件,发射炮弹的函数就会被调用。以
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
为例,我们事先在Project Settings>Input的Action Mappings中将空格键映射给了"Jump",换句话说在程序里空格键就代表"Jump",然后在"Jump"的按下状态IE_Pressed
(或者叫"Jump"的按下事件)注册了Character对象的Jump函数。于是游戏中,当玩家按下空格键就会调用Jump函数。
小建议:
函数回调是游戏开发中常用的语法,一定要理解并会使用。
TEXT()是干嘛的?
关键字:
TEXT(),FName,FString,FText
简介:
TEXT()是虚幻的宏。为了提高运行效率将机器性能压榨到极致,虚幻不辞辛苦地设计了
FName
、FString
以及FText
等多种和字符串相关的类型。机器舒服了,人就要辛苦点了。上面的TEXT("FollowCamera")
就是将"FollowCamera"转换成FName类型。
建议:
nullptr是干嘛的?
关键字:
空指针、nullptr
简介:
nullptr即空指(null pointer)的缩写,是C++11中定义的更严谨的空指针赋值方式。
建议:
当为一个指针赋空值时使用nullptr代替NULL。
函数中的<>是干嘛的?
关键字:
泛型函数
简介:
有“<>”的函数是泛型函数,其中的“<>”中要填入的是类型参数。它不是一个值,而是一种类型。泛型函数可以将逻辑相同而数据类型不同的一些列函数中的数据类型抽象成类型参数,从而实现函数的复用。
小建议:
泛型函数的使用非常有利于代码的简化,建议熟练掌握。
const是干嘛的?
关键字:
const
简介:
const是常量(constant)的缩写,这个关键字对提高程序的健壮性大有帮助,可以避免程序“偷偷摸摸”地修改我们不希望被修改的值,甚至还可以提高运行效率。const的用法很多,篇幅所限,仅解释一下C++版模板中遇到的两处用法。
const FRotator Rotation = Controller->GetControlRotation();
告诉编译器视Rotation为常量,其值不再允许更改。class USpringArmComponent* GetCameraBoom() const { return CameraBoom; }
告诉编译器在函数体内不可以修改成员变量。
小建议:
const是个好东西,建议大家全面学习一下,能用的地方就尽量用。
小结
纯C++版第三人称模板中的知识点就总结到这里了,如果有遗漏欢迎留言回复,我会补充进来。预祝大家开心愉快地开启虚幻C++之旅!
以上是关于[玩转UE4/UE5动画系统>C++篇>C++基础] 之 C++版模板中那些琐碎而又应知应会的语法知识小结(本文献给刚学完谭浩强就来啃UEC++的同学)的主要内容,如果未能解决你的问题,请参考以下文章