本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏《玩转UE4/UE5动画系统》。教程中使用的资源及工程将以开源项目的形式更新到GitHub:玩转UE4上。


工程文件: 玩转UE4(GitHub)

文章目录

  • 前言
  • 语法知识
    • 1. #pragma once是干嘛的?
    • 2. UCLASS()是干嘛的?
    • 3. GENERATED_BODY()是干嘛的?
    • 4. UPROPERTY是干嘛的?
    • 5. FORCEINLINE是干嘛的?
    • 6. 类型前面的class关键字是干嘛的?
    • 7. check()是干嘛的?
    • 8. 什么是函数回调
    • 9. TEXT()是干嘛的?
    • 10. nullptr是干嘛的?
    • 11. 函数中的<>是干嘛的?
    • 12. const是干嘛的?
    • 13. 补充:类的声明中形如"模块(项目)名_API"的宏是干嘛的?
  • 小结

前言

在开始玩转UE4/UE5动画系统系列教程C++部分的教程之前,老王简单总结了虚幻C++版项目模板代码中的一些语法知识点。本文主要面向有一定C++基础(大约是大学学过C++,考试成绩60分左右)并且想使用C++开发虚幻项目的初学者。以下内容均为简要介绍以及一些使用小建议,目的是让初学者新建一个虚幻C++以后,看到项目中的代码不至于云里雾里。我为每个语法点提供了关键字,以供有进一步学习需求的朋友查询相关资料。

语法知识

下面的代码都取自于引擎自动生成的C++模板中XXXXCharacter.hXXXXCharacter.cpp

1. #pragma once是干嘛的?

关键字:

重复编译

简介:

当该头文件被其它源文件多次包含时,#pragma once可以防止编译器对该头文件的重复编译。

小建议:

在你的每个头文件第一行写上#pragma once

2. UCLASS()是干嘛的?


关键字:

UCLASS

简介:

UCLASS是虚幻的宏,它固定放置在类的声明上部,只有派生自UObject的类(虚幻类)才可以用UCLASS标记。在一个类标记了UCLASS就意味着该类对象的垃圾回收、引用更新等机制交由虚幻引擎管理。

小建议:

阅读官方文档《对象》,并按照虚幻的设计规范合理使用。

3. GENERATED_BODY()是干嘛的?


关键字:

GENERATED_BODY

简介:

新建一个虚幻类以后一般会由代码生成系统自动在类声明的内部添加一行GENERATED_BODY()宏代码。编译的时候会自动替换成所需代码。

小建议:

别删除也别动,在GENERATED_BODY()的下方填充你的代码。

4. UPROPERTY是干嘛的?

关键字:

反射系统、UPROPERTY、UFUNCTION《对象》

简介:

UPROPERTY叫做属性声明宏,虚幻C++在标准C++基础之上实现了一套反射系统(Reflection System),反射系统负责垃圾回收、引用更新,编辑器集成等一系列高级且有用的功能。而UPROPERTY的作用就是声明该属性在反射系统系统的行为。比如上面例子中的UPROPERTY就是告诉反射系统:“下面的CameraBoomFollowCamera在编辑器的属性窗口可见,但不能被编辑,在蓝图中只读,在编辑器中显示在Camera类别,并且当它是private时在蓝图中依然可访问”。和UPROPERTY类似的还有UFUNCTION函数声明宏。

小建议:

阅读官方文档《UPROPERTY》、《UFUNCTION》以及《对象》,并按照虚幻的设计规范合理使用。

5. FORCEINLINE是干嘛的?

关键字:

强制内联

简介:

FORCEINLINE是一个标记强制内联命令的宏。内联是C++编译优化的一种方式,其原理就是将函数“复制”到被调用的地方,这样就削减了函数入栈出栈等一系列操作所需的消耗。但是体积庞大或者运算复杂的函数并不建议使用内联。

小建议:

如果你的函数只是像上面那样简单的返回一个值或者成员变量,那么用FORCEINLINE就对了。

6. 类型前面的class关键字是干嘛的?

class关键字最常规的用法是声明一个类,然而用在类似下面的地方就有点让人迷糊了。



关键字:

前置声明

简介:

class的这种用法是C++的常用技巧,叫做前置声明( Forward Declarations),其实就是告诉编译器:“这个类型我先不包含它的头文件了,您先别着急,后面类的定义里调用它的时候我一定补上!” 。这种技巧可以让当前头文件暂时不包含该类型的头文件,从而为头文件树瘦身并且有效地避免了头文件的循环包含。

小建议:

这个技巧仅在头文件中适用,如果你的声明中仅使用了某个类的类型声明某个变量或返回值,那么在头文件中无须包含该类的头文件,仅用 class声明即可,但是不要忘了在cpp中包含它的头文件。

7. check()是干嘛的?


关键字:

断言、assert

简介:

用于检验程序运行时错误的一种方式。当check()中的表达式为false时,程序会停止运行。check()默认仅在Debug版本中有效,在Release版中无效。断言一般不用于逻辑上的判断,而是用于类似组件对象获取失败这样严重的系统问题时才用。

小建议:

阅读官方文档《断言》,并合理使用。

8. 什么是函数回调


关键字:

函数回调

简介:

传统的函数调用逻辑是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函数。

小建议:

函数回调是游戏开发中常用的语法,一定要理解并会使用。

9. TEXT()是干嘛的?


关键字:

TEXT(),FName,FString,FText

简介:

TEXT()是虚幻的宏。为了提高运行效率将机器性能压榨到极致,虚幻不辞辛苦地设计了FNameFString以及FText等多种和字符串相关的类型。机器舒服了,人就要辛苦点了。上面的TEXT("FollowCamera")就是将"FollowCamera"转换成FName类型。

建议:

阅读官方文档《FName》,《FString》,《FText》,并熟悉三种类型的使用及相互转换方法。

10. nullptr是干嘛的?

关键字:

空指针、nullptr

简介:

nullptr即空指(null pointer)的缩写,是C++11中定义的更严谨的空指针赋值方式。

建议:

当为一个指针赋空值时使用nullptr代替NULL。

11. 函数中的<>是干嘛的?

关键字:

泛型函数

简介:

有“<>”的函数是泛型函数,其中的“<>”中要填入的是类型参数。它不是一个值,而是一种类型。泛型函数可以将逻辑相同而数据类型不同的一些列函数中的数据类型抽象成类型参数,从而实现函数的复用。

小建议:

泛型函数的使用非常有利于代码的简化,建议熟练掌握。

12. const是干嘛的?

关键字:

const

简介:

const是常量(constant)的缩写,这个关键字对提高程序的健壮性大有帮助,可以避免程序“偷偷摸摸”地修改我们不希望被修改的值,甚至还可以提高运行效率。const的用法很多,篇幅所限,仅解释一下C++版模板中遇到的两处用法。

  • const FRotator Rotation = Controller->GetControlRotation(); 告诉编译器视Rotation为常量,其值不再允许更改。
  • class USpringArmComponent* GetCameraBoom() const { return CameraBoom; } 告诉编译器在函数体内不可以修改成员变量。

小建议:

const是个好东西,建议大家全面学习一下,能用的地方就尽量用。

13. 补充:类的声明中形如"模块(项目)名_API"的宏是干嘛的?

在虚幻引擎中添加一个类,自动生成的代码中经常可以看到形如"模块(项目)名_API"的宏

这个问题老王也一时没搞明白,于是请教了传说中的虚幻社区贡献群的大佬,大佬们解释的比较清楚,征求过大佬们的许可,我就直接截图了:


不加这个宏可能产生的问题:https://zhuanlan.zhihu.com/p/367223779

@Remmer兄在他博客《UE4 模块,PrivateDependencyModuleNames?》中的解释:

小结

纯C++版第三人称模板中的知识点就总结到这里了,如果有遗漏欢迎留言回复,我会补充进来。预祝大家开心愉快地开启虚幻C++之旅!

[玩转UE4/UE5动画系统>C++篇>C++基础] 之 C++版模板中那些琐碎而又应知应会的语法知识小结(本文献给刚学完谭浩强就来啃UEC++的同学)相关推荐

  1. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 ALS V4地面站立动作状态机详解

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的 ...

  2. [玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的资 ...

  3. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 ALS V4 主状态机详解

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的 ...

  4. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 Foot IK系统(ALS V4实现方案详解)

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式. 教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>. 教程中使 ...

  5. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 布娃娃系统(ALS V4实现方案详解)

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式. 教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>. 教程中使 ...

  6. [玩转UE4/UE5动画系统>Control Rig篇] 之 使用Control Rig实现目标偏移(Aim Offset)(附项目代码)

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的资 ...

  7. 谭浩强c 语言程序设计

    谭浩强c 语言程序设计  1 C语言概述  1.1  C语言的发展过程  1.2  当代最优秀的程序设计语言  1.3  C语言版本  1.4  C语言的特点  1.5  面向对象的程序设计语言  1 ...

  8. 语言程序设计第4版黄洪艺_谭浩强《C程序设计》第4版网授精讲班【教材精讲+考研真题串讲】视频网课讲义课程资料...

    谭浩强<C程序设计>(第4版)网授精讲班[教材精讲+考研真题串讲] 网授课程 谭浩强<C程序设计>(第4版)网授精讲班[注:因第11章考试不做要求,所以老师没有讲解!][共31 ...

  9. 谭浩强课后题(数组篇)

    谭浩强课后题(数组篇) 用筛法求素数 冒泡排序 逆序存放数组元素 奇数阶魔方 用筛法求素数 代码: #include<stdio.h> #include<string.h> # ...

  10. C语言实验系统PPT展示,c语言第四谭浩强机实验课件.ppt

    c语言第四谭浩强机实验课件.ppt 名人名言,"人最宝贵的东西是生命,生命属于我们只有一次.人的一生应当这样度过当他回首往事时,他不因虚度年华而悔恨,也不因碌碌无为而羞愧.这样在他临死的时候 ...

最新文章

  1. GO!自制一款【不丑】的名片
  2. 分享Kali Linux 2017年第17周镜像文件
  3. CodeForces - 632E Thief in a Shop 完全背包
  4. 语音信号的预加重和加窗处理
  5. 5月16 JSON的一些知识点及AJAX的应用
  6. WSE 3.0异步调用, MTOM, Custom Policy Trace Assertion
  7. HDU4267(2012年长春站)
  8. 【Java】二维码生成,QRcode
  9. python调用libvirt_通过python获取kvm虚拟机的监控信息(基于libvirt API)
  10. GCC-3.4.6源代码学习笔记
  11. System V消息队列
  12. 【权限设计】一个案例,三个角色,简单说下B端产品的权限设计
  13. PhotoShop 2022 mac版新增功能
  14. 九度 1532:棋盘寻宝扩展(背包方案统计)
  15. Spring Boot设置上传文件大小
  16. c语言所有的数学函数,C语言函数—数学函数,全在这里!
  17. matlab编程dea模型,DEA的Matlab程序(数据包络分析)(最新整理)
  18. english need study and insist 1
  19. 【翻译】Flux安全审计已经结束
  20. Latex中使用thebibliography环境时去除“参考文献”标题方法

热门文章

  1. java界面绘制地铁路线_基于 HTML5 Canvas实现 的交互式地铁线路图
  2. python游走代码_用Python模拟随机游走(Random walks)
  3. win10 卸载软件 清除注册表 Revo Uninstaller Pro
  4. harmonyos下载安装,HarmonyOS系统
  5. 【学习笔记 31】 buu [0CTF 2016]piapiapia
  6. python画机器猫
  7. 1. Boost.Asio入门
  8. jQuery水平手风琴图片轮播切换
  9. Pytorch中iter(dataloader)的使用
  10. 数据挖掘:Apriori 关联规则分析算法原理分析与代码实现