【UEC++学习】基础类型与转化

1. 基本类型

  • 布尔类型bool:占用1个字节
  • uint8:占用 1 byte,取值范围为0~255
  • uint16:占用 2 byte
  • uint32:占用 4 byte
  • uint64:占用 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;
};

structclass的区别:
(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;
};

而位域能手动控制分配的大小,极大的减少了占用空间的大小。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值