1. 基本类型
- 布尔类型
bool
:占用1个字节 uint8
:占用 1 byte,取值范围为0~255uint16
:占用 2 byteuint32
:占用 4 byteuint64
:占用 8 byte
typedef unsigned char uint8
typedef unsigned short uint16
typedef unsigned int uint32
typedef unsigned long long uint64
我们可以使用sizeof(XXX)
来判断类型的字节大小。
2. FName,FString,FText
FName
:大小为 12 byte- FName不区分大小写,并且不可变,无法被操作
- 提供了对FName的键值访问,因此访问速度比较快
- FName的子系统提供了对FName快速转化为字符串
FString
:大小为 12 byte- 提供了对FString的修改、比较,也同时增加了性能消耗
FText
:大小为 24 byte- 一般用作显示和语言的翻译
FString、FName、FText相互之间的转化
{
/** FString 转化为 FName */
FString Str = TEXT("MyString");
FName Name = FName(*Str);
/** FName 转化为 FString */
FString NewString = Name.ToString();
}
{
/** FText 转化为 FName */
FName MyName = FName(*MyText.ToString());
/** FName 转化为 FText */
FText MyText1 = FText::FromName(MyName);
}
{
/** FString 转化为 FText */
FString Str = TEXT("MyString");
FText MyText = FText::FromString(Str);
/** FText 转化为 FString */
FString NewString = MyText.ToString();
}
FString与Int32、float、bool的转化
{
/** FString 转化为 Int32 */
FString MyString = TEXT("MyString");
int32 i1 = FCString::Atoi(*MyString); // 使用FCString
int32 i2 = atoi(TCHAR_TO_UTF8(*MyString)); // 使用C++原生方法
/** FString 转化为 float */
float f1 = FCString::Atof(*MyString); // 使用FCString
float f2 = atof(TCHAR_TO_UTF8(*MyString)); // 使用C++原生方法
/** FString 转化为 bool */
bool b = MyString.ToBool();
/** int 转化为 FSting */
FString FStr1 = FString::FromInt(123);
/** float 转化为 FSting */
FString FStr2 = FString::SanitizeFloat(36.1f);
/** bool 转化为 FSting */
bool myBool;
FString FStr3 = myBool ? TEXT("true") : TEXT("false");
}
FString与C++原生的转化
{
// std::string 转化为 FString
std::string stdStr = "MyString";
FString a = FString(stdStr.c_str());
// FString 转化为 std::string
std::string newString(TCHAR_TO_UTF8(*a));
// FString 转化为 char*
char* newChar = TCHAR_TO_UTF8(*a);
// char* 转化为 FString
FString NewString = FString(UTF8_TO_TCHAR(newChar));
}
{
// FString 转化为 TCHAR
FString MyString = TEXT("UEString");
const TCHAR* MyChar = *MyString;
}
char*
与TCHAR*
的转化
TCHAR_TO_ANSI(*str)
ANSI_TO_TCHAR(*str)
TCHAR_TO_UTF8(*str)
UTF8_TO_TCHAR(*str)
3. FVector、FRotator、FTransform
FVector
:是一个三维数值型,每个数为浮点型FRotator
:是一个三维数值型,每个值为欧拉角FTransform
:FVector和FRotator的结合
4. enum与struct
/** 创建UENUM */
UENUM(BlueprintType)
enum class EMyEnum : uint8
{
RED,
BLUE,
GREEN
};
/** 使用UENUM */
EMyEnum MyEnum;
switch (MyEnum)
{
case (uint8)EMyEnum::RED:
// do somethings
break;
case (uint8)EMyEnum::BLUE:
// do somethings
break;
case (uint8)EMyEnum::GREEN:
// do somethings
break;
}
USTRUCT()
struct FMyStruct
{
GENERATED_USTRUCT_BODY(); // 生成结构体反射
uint32 myInt32 : 8;
char myChar : 1;
uint8 myInt8 : 4;
};
struct
与class
的区别:
(1)原生C++中,struct
默认的变量和函数是public,class
默认的变量和函数是private。
(2)在UE中,struct
的函数是不能访问到的。
(3)class
可以被继承,struct
不能被继承,UE中class
可以继承UObject而struct
不行。
在结构体中,UEC++经常使用位域来节省占用空间大小。
struct <位域结构名>
{
...
<类型说明符> <位域名> : <位域长度> // 位域列表
...
};
结构体会用内存对齐来分配大小,首先会找结构体中最大的变量的占用空间,以此为单位从第一个开始分配,若单位空间不够则开辟下一空间,我们用下面的例子来说明这样的分配规则。
/** 总共占用12个字节 */
struct FMyStruct
{
char myChar;
uint32 myInt32;
uint8 myInt8;
};
/** 总共占用8个字节 */
struct FMyStruct
{
uint32 myInt32;
char myChar;
uint8 myInt8;
};
而位域能手动控制分配的大小,极大的减少了占用空间的大小。