UE4中C++編程(一)


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

    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM