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++開發之旅系列文章