UE4中C++编程(一)
阅读原文时间:2021年11月16日阅读:3

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

}