一: C++工程和Gameplay框架
GameInstance
它適合放置獨立於關卡的資訊,比如說顯示UI。
GameMode
表示遊戲玩法, 包含遊戲進行的規則和勝利條件等等資訊,遊戲模式是和關卡繫結在一起的,一個關卡只能有一個遊戲模式,但是一個遊戲可以有多個關卡。它通常和記錄規則的GameState組合在一起。
Pawn/Character
Pawn指的是活動的遊戲主體。Character是指可移動的,有碰撞的人物。其資訊一般記錄在PlayerState中。
PlayerController
虛幻抽象出來的一個層,用於控制Pawn行動。
需要注意的是:在新建工程資料夾中,當需要更新版本時,只需要上傳“Content“、”Config“、”Source“、”Binuries“以及sln解決方案檔案和UE project檔案。
二:UE4基本型別與容器
基本型別:
bool大小:1 byte—— 1 byte=8 bit 取值範圍:true或者false
uint8大小: 1 byte——子主題1 取值範圍0~255
int32大小:4 byte—— int 取值範圍-2^32 ~+2^32-1
float大小:4 byte 取值範圍: 2^32 ~+2^32-1
int64大小:8 byte 取值範圍-2^64 ~+2^64-1
FNames大小:12 byte 用途:FNames不區分大小寫。它們為不可變,FName無法被操作。FNames的儲存系統和靜態特性決定了通過鍵進行FNames的查詢和訪問速度較快。FName子系統的另一個功能是使用雜湊表為FName轉換提供快速字串。
FString大小:12 byte 與FName和FText不同,FString可以與搜尋、修改並且與其他字串比較。不過,這些操作會導致FString的開銷比不可變字串類更大。這是因為FString物件儲存自己的字元陣列,而FName和FText物件儲存共享字元陣列的指標,並且可以完全根據索引值建立相等性。
FText大小:24 byte 一般用作顯示和文字本地化
Fvector 三維向量
FVector2D 二維向量
Frotator Pitch是圍繞Y軸旋轉,也叫做俯仰角;Yaw是圍繞Z軸旋轉,也叫偏航角;Rol是圍繞X軸旋轉,也叫翻滾角
容器:1、單個變數2、陣列3、集合4、對映
需要注意的是:對於變數的定義,分為兩種型別:一種使用預設資料型別,如bool bTestBoolean,一種是使用C++的位域模式,如 uint8 bTestB:1。使用位域可以節省記憶體空間。
三:UE4反射常用的巨集UPROPERTY和UFUNCTION
反射資料描述了類在執行時的內容。這些資料所儲存的資訊包括類的名稱、類中的資料成員、每個資料成員的型別、每個成員位於物件記憶體映像的偏移(offset),此外,它也包含類的所有成員函式資訊。
在UE4反射機制中,具體來看,對於一個類(UClass),我們可以獲得這個類的所有屬性和方法,而對於一個類物件(UObject),我們可以呼叫它所擁有的方法和屬性,前提是這些屬性和方法被納入到UE4的反射系統。
UPROPERTY
EditAnywhere
在編輯中可見。且可編輯
EditDefaultsOnly
只在類預設設定中可見
EditInstanceOnly
可通過屬性視窗進行編輯,但只能在例項上進行,不能在原型上進行
VisibleAnywhere
在編輯中可見,且不可編輯
BlueplptReadOnly
藍圖只讀
BlueprintReadWrite
藍圖可讀可寫
UFUNCTION
BlueprintCallable
此函式可在藍圖或關卡藍圖圖表中執行。
BlueprintPure
此函式不對擁有它的物件產生任何影響,可在藍圖或關卡藍圖圖表中執行。
BlueprintlmplementableEvent
需要在藍圖裡面過載
BlueprintNativeEvent
此函式旨在被藍圖覆蓋掉,但是也具有預設原生實現。用於宣告名稱與主函式相同的附加函式,但是末尾新增了lmplementation,是寫入程式碼的位置。如果未找到任何藍圖覆蓋,該自動生成的程式碼將呼叫Implementation方法。
CalllnEditor
可通過細節(Details) 皮膚中的按鈕在編輯器中的選定例項上呼叫此函式。
後設資料說明集:UPROPERTY(..., meta=())
舉例:UPROPERTY(EditAnywhere, meta=(ClampMin=”10”, ClampMax=”100”)),表示下面定義的變數在10~100之間。
四: UE4型別的列舉UE4型別的結構體
先講一下UE4中的命名規範,
Axxxxx 表示繼承自Actor類
Uxxxxx 表示繼承自Object類
Fxxxxx 表示C++中自己建立的
Exxxxx 表示列舉型別
Ixxxxx 表示介面型別
Sxxxx 表示Slate
列舉定義方式:
UENUM(BlueprintType)
enum EcustomColorType //或者enum class EcustomColorType :uint8
{
RED,
BLUE,
YELLOW
};
結構體定義方式:
USTRUCT(BliueprintType)
Struct FtestStruct
{
GENERATED USTRUCT BODY()
Int32 ss;
}
五: Aactor、Component、Uobject
Aactor、Component:汽車與輪子的關係
Uobject:四大功能:反射、垃圾回收(GC)、序列化、COD(class object default)
六:基本型別轉換
{ //FString To FName FString Str = TEXT("TestString"); FName Name = FName(*Str); //FName To FString FString TargetFString = Name.ToString(); } { //std::string to FString std::string stdStr = "TestString"; FString MyStr(stdStr.c_str()); //FString To char* char* c = TCHAR_TO_UTF8(*MyStr); // FString to std::string std::string TargetString(c); } { //FString to Int32 FString Str = TEXT("TestString"); int32 i = FCString::Atoi(*Str); //or i = atoi(TCHAR_TO_UTF8(*Str)); // FString to float int32 f = FCString::Atof(*Str); //or f = atof(TCHAR_TO_UTF8(*Str)); //FString To bool bool bNewbool = Str.ToBool(); // Int32 to FString FString TStr = FString::FromInt(123); // float to FString FString TStr1 = FString::SanitizeFloat(36.23f); // bool to FString int32 b = true; FString Out= b ? TEXT("true"): TEXT("false"); } { //FString to TCHAR* FString Str1(TEXT("TestString")); const TCHAR* MyTChar = *Str1; //FString to FText FText MyText = FText::FromString(Str1); //FText to FName FName Name = FName(*MyText.ToString()); //FName to FText FText MyText1 = FText::FromName(Name); } { //FString To TArray<uint8> FString Str = "Hello UE4";//原資料 TArray<uint8> outDataArray;//目標資料 TCHAR* CharData = Str.GetCharArray().GetData(); int32 Len = FCString::Strlen(CharData); for (int i = 0; i < Len; i++) { uint8* dst = (uint8*)TCHAR_TO_UTF8(CharData); CharData++; outDataArray.Add(*dst); } //FString To TArray<uint8> FBase64::Decode(Str, outDataArray); //TArray<uint8> To FString const std::string cstr(reinterpret_cast<const char*>(outDataArray.GetData()), outDataArray.Num()); FString MyStr1(cstr.c_str()); //TArray<uint8> To FString FString DestStr = FBase64::Encode(outDataArray); } { //列舉轉字串 enum ETempEnum { One, Two, Three, }; { //通過列舉型別的名字找到對應列舉型別的COD class object defalut const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("ETempEnum"), true); if (EnumPtr) { FString str = EnumPtr->GetNameStringByIndex(ETempEnum::Two); } } //字串轉列舉 { //通過列舉型別的名字找到對應列舉型別的COD class object defalut const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("ETempEnum"), true); if (EnumPtr) { ETempEnum OutEnum= (ETempEnum)EnumPtr->GetIndexByNameString(TEXT("Three")); } } } //額外補充 { //FString To Md5 FString String("sdsafasfasf"); FMD5::HashAnsiString(*String); // FString To Sha1 FSHA1 Sha1Gen; Sha1Gen.Update((unsigned char*)TCHAR_TO_ANSI(*String), FCString::Strlen(*String)); Sha1Gen.Final(); FString Sha1String; for (int32 i = 0; i < 20; i++) { Sha1String += FString::Printf(TEXT("%02x"), Sha1Gen.m_digest[i]); } }