Aery的UE4 C++游戏开发之旅(2)编码规范
C++基础类型规范
由于PC、XBOX、PS4等各平台的C++基础类型大小可能不同(实际上绝大部分都是整型类型的大小不同),因此UE4提供了如下可移植基础类型的别名来统一规范类型大小:
- bool 代表布尔值(不会假定布尔尺寸)。
- TCHAR 代表字符(不会假定TCHAR尺寸)。
- uint8 代表无符号字节(1字节)。
- int8 代表带符号字节(1字节)。
- uint16 代表无符号“短”字符(2字节)。
- int16 代表带符号“短”字符(2字节)。
- uint32 代表无符号整数(4字节)。
- int32 代表带符号整数(4字节)。
- uint64 代表无符号“四字”(8字节)。
- int64 代表带符号“四字”(8字节)。
- float 代表单精确浮点(4字节)。
- double 代表双精确浮点(8字节)。
- PTRINT 代表可能含有指针的整数(不会假定PTRINT尺寸)。
- 当需要明确基础类型尺寸大小(例如需要序列化等功能),应使用可移植的类型。
- 如果代码中的整型类型大小不是很重要,可直接使用C++的 int 和无符号 int 类型(不同的平台上的大小可能不同),典型的例子是用于循环的整型变量i。
个人认为,如果想更简单明了地选择类型的话,那么建议在类/结构体的声明部分(变量/函数返回值/函数参数等)使用可移植类型,而函数实现里出现的某些无关紧要的临时变量(例如循环体的整型变量i)则可以直接使用C++基础类型。
UCLASS()
class MYPROJECT_API USomething: public UObject{
UPROPERTY()
int32 ID;
UFUNCTION()
uint32 GetValue();
};
uint32 USomething::GetValue(){
uint32 value = 0;
for(int i = 0; i < vec.size(); ++i){
value += vec[i];
}
return value;
}
命名规范
命名(如类型或变量)中的每个单词需大写首字母,单词间通常无下划线。
例如:Health 和 UPrimitiveComponent,而非 lastMouseCoordinates 或 delta_coordinates。
bool变量必须以b为前缀(例如 bPendingDestruction 或 bHasFadedIn)。
类型名前缀需使用额外的大写字母,用于区分其和变量命名。
例如:FSkin 为类型名,而 Skin 则是 FSkin 的实例。
类型命名前缀规范如下:
蓝图类别 前缀 继承自 UObject U 继承自 AActor A 继承自 SWidget S 抽象界面类的前缀 I 枚举类的前缀 E 模板类 T 其他多数类均以F为前缀,而部分子系统则以其他字母为前缀。
模板实例化的Typedef不再是模板,并应加上相应前缀,例如:typedef TArray<FMytype> FArrayOfMyTypes;
蓝图命名:"BP"+类别缩写+"_"+名字
例如: BPA_Player
蓝图类别 前缀 蓝图Actor BPA_ 蓝图结构 BPS_ 蓝图枚举 BPE_ 蓝图接口 BPI_ 蓝图函数库 BFL_ 蓝图宏库 BML_
头文件规范
- 确保自己include的头文件不要放在 "XXX.generated.h" 文件下面,因为Unreal Header Tool编译工具默认这个文件就是头文件列表的最后一行了。
字符串规范
- 在字符串字面量周围使用 TEXT() 宏:若未使用,在文字中构建 FStrings 的代码将导致不理想的字符转换过程。
"Hello World!"; //Not so well
TEXT("Hello World!"); //OK
字符集规范
- 应将C++代码文件都保存为utf8格式:否则可能会出现在UE4蓝图中调用C++代码(函数、类等)时,出现注释乱码的情况。
错误处理规范
- 不要使用C++异常机制(try,catch),UE4代码默认是不支持的,推荐使用Assertions。
//example
int i=1;
verify(i==0);
具体UE4提供的断言可查看:虚幻引擎4 官方文档 | 断言相关规范
参考
系列其他文章:Aery的UE4 C++开发之旅系列文章
Aery的UE4 C++游戏开发之旅(2)编码规范的更多相关文章
- Aery的UE4 C++游戏开发之旅(1)基础对象模型
目录 UObject Actor种类 AActor APawn(可操控单位) AController(控制器) AGameMode(游戏模式) AHUD(HUD) ... Component种类 UA ...
- Aery的UE4 C++游戏开发之旅(3)蓝图
目录 蓝图 蓝图命名规范 蓝图优化 暴露C++至蓝图 暴露C++类 暴露C++属性 暴露C++函数 暴露C++结构体/枚举 暴露C++接口 蓝图和C++的结合方案 使用继承重写蓝图 使用组合重写蓝图 ...
- Aery的UE4 C++游戏开发之旅(4)加载资源&创建对象
目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetRef ...
- Aery的UE4 C++游戏开发之旅(5)字符&字符串
目录 TCHAR 字符 使用TEXT()宏包裹字符串字面量 转换字符编码 FString 字符串 FString 剖析 FString 使用 FName 字符串 FName 剖析 FName 使用 F ...
- Android游戏开发之旅 View类详解
Android游戏开发之旅 View类详解 自定义 View的常用方法: onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) ...
- 【安全开发】IOS安全编码规范
申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...
- 【安全开发】Android安全编码规范
申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...
- 《cocos2d-x游戏开发之旅》问题2016-10-7
今天按书上做,遇到问题卡住了 书P115 项目是 littlerunner
- Cocos2d-x 3.x游戏开发之旅 笔记
#include "HelloWorldScene.h"#include "SimpleAudioEngine.h"#include "MyHello ...
随机推荐
- 数据表与简单java类映射转换
简单的Java类的定义来源于数据表的结构, 例如:雇员信息表.部门信息表描述的就是雇员或部门的信息, 在实际的开发之中,数据表和简单java类之间的映射关系如下: 1. 数据实体表设计 = 类的定义: ...
- 感觉async await 异步编程 并不能提升性能?
我有2个方法 代码相同 都是执行上传文件IO操作 一个同步 一个异步 接着我用POSTMAN 分别用200个线程 去同时测试2个接口 结果很意外 2个接口 同时执行完成的速度 异步更慢 之前经常看别人 ...
- Djangoday3template
template第一个demo从后台传递数据到前端从后台传递list前端for循环显示内容后台传输dict到前端 template第一个demo template存在app/templates目录下 ...
- PTA 1139 1138 1137 1136
PAT 1139 1138 1137 1136 一个月不写题,有点生疏..脑子跟不上手速,还可以啦,反正今天很开心. PAT 1139 First Contact 18/30 找个时间再修bug 23 ...
- C++ 关键字之override
非原创,转载自stackoverflow 确切的说override并非一个keyword The override keyword serves two purposes: It shows the ...
- 解决 Docker Hadoop ssh "Connection to * closed".问题
Docker 最近很火, 可以快速轻量级地虚拟出多个node,所以打算在Docker中跑Hadoop伪分布式应用. 其实要做出个简单的版本倒是不难,主要在 建立ssh无密码登录本机时,出现刚登录上去, ...
- 洛谷 题解 P4613 【[COCI2017-2018#5] Olivander】
我又双叒叕被包菜辣! P4613 [COCI2017-2018#5] Olivander 首先,不知道为什么这题无法提交翻译: 所以,我先放个翻译: 哈利波特在与伏地魔的战斗中损坏了他的魔杖.他决定在 ...
- P2910 [USACO08OPEN]寻宝之路Clear And Present Danger |Floyd
题目描述 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛. 一张藏宝图上说,如果他的路程上经过的小岛依次出现了Ai,A2 ...
- Python中 * 与 **, *args 与 **kwargs的用法
* 用于传递位置参数(positional argument) ** 用于传递关键字参数(keyword argument) 首先,先通过一个简单的例子来介绍 * 的用法: def add_funct ...
- 2017 ACM/ICPC 沈阳 K题 Rabbits
Here N (N ≥ 3) rabbits are playing by the river. They are playing on a number line, each occupying a ...