UE4中C++程式設計(一)

achevery發表於2021-11-15

一: 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]);
        }

    }

 

相關文章