一、基本数据类型
UE对于C++基本数据类型进行深度重定义,禁止在UE中使用C++的基本数据类型,这样会影响引擎的跨平台特性
//UE数据类型
bool bTest01 = true; //true,false
TCHAR ch = 'a'; //字符型,不要用char c1
uint8 a = 10; //无符号字节
uint16 a1 = 20; //无符号短整型
uint32 a2 = 30; //无符号整型
uint64 a3 = 40; //无符号"四字"
int8 b1 = -10; //有符号字节
int16 b2 = -20; //有符号短整型
int32 b3 = -30; //有符号整型
int64 b4 = -40; //有符号"四字"
float c = 3.14; //单精度浮点型
double d = 3.14; //双精度浮点型
类型转换:
static_cast<int>()
//静态转换
reinterpret_cast<int>()
//强制转换
std::string str;
int a = atoi(str.c_str());
//将string转成char,再最终转成int
二、字符编码
- 虚幻引擎4中的所有字符串都作为FStrings或TCHAR数组以UTF-16 格式存储在内存中
- UE4也提供了如下的字符串和编码转换的宏定义(StringConv.h):
TCHAR_TO_ANSI(str)
ANSI_TO_TCHAR(str)
TCHAR_TO_UTF8(str)
UTF8_TO_TCHAR(str)
三、字符类型
- FString:可以被操作的字符串。开销大于其他类字符串类型
FString 字符串类型的三种写法:(必须用 TEXT宏 包裹字符串)
FString F1 = TEXT("我想出去玩!");
FString F2(TEXT("我想睡觉!"));
FString F3 = FString (TEXT("我不想上班!"));
//在屏幕上输出F1"我想出去玩!"
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, F1);
//在日志输出 F1 + F2 + F3(要加*)
UE_LOG(LogTemp, Log, TEXT("%s\n%s\n%s\n"), *F1, *F2, *F3);
FString 的比较操作:(Equals 默认开启大小写)
if (F1.Equals(F2, ESearchCase::IgnoreCase)){
UE_LOG(LogTemp, Log, TEXT("两个字符串相等"));
}else{
UE_LOG(LogTemp, Log, TEXT("两个字符串不相等咯"));
}
if (F1 == F2) //操作符重载==(忽略大小写)
FString 的查询操作:
//1.Contains(要查的连续子字符串, 默认忽略大小写, 默认从前往后查),返回bool
if (F1.Contains(TEXT("我"),ESearchCase::IgnoreCase,ESearchDir::FromStart)){
UE_LOG(LogTemp, Log, TEXT("字符串包含“我”"));
}else{
UE_LOG(LogTemp, Log, TEXT("字符串不包含“我”"));
}
//2.Find(要查的连续子字符串, 默认忽略大小写, 默认从前往后查, 默认查询的起始位置从第一个),返回int32的字符串
int32 SPlace = F3.Find(TEXT("我"),ESearchCase::IgnoreCase,ESearchDir::FromStart,-1);
FString 的检查操作:
//IsEmpty()
if (F2.IsEmpty()){
UE_LOG(LogTemp, Log, TEXT("空字符串"));
}
FString 的路径分隔符:
F1 = F2 / F3;
UE_LOG(LogTemp, Log, TEXT("%s"), *F1);
//运行结果如下:
//我想睡觉!/我不想上班!
FString 的格式化文本操作:
FString F4 = FString::Printf(TEXT("%d--%f--%s--"), 232, 3.15f, *F2);
UE_LOG(LogTemp, Log, TEXT("%s"), *F4);
//运行结果如下:
//232--3.150000--我想睡觉!--
FString 的裁切操作:
//Split()
F1.Split(TEXT("玩"), &F2, &F3); //以"玩"为中心截断,前面字符串赋给F2,后面赋给F3
UE_LOG(LogTemp, Log, TEXT("%s\n%s\n%s\n"), *F2, *F3, *F1);
//打印结果如下:
//我想出去玩
//!
//我想出去玩!
FName:资源命名字符串,用来存储名称(散列存储),速度快
FName 字符串类型的四种写法:(必须用 TEXT宏 包裹字符串)
FName N1 = TEXT("张三");
FName N2(TEXT("张小三"));
FName N3 = FName(TEXT("张大三"));
//用 FString 初始化 FName
FString Str = TEXT("张三三");
FName N4 = *Str;
//在屏幕上输出N1"张三"
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, N1.ToString());
//在日志输出 N1 + N2 + N3 + N4
UE_LOG(LogTemp, Log, TEXT("%s\n%s\n%s\n%s"), *N1.ToString(), *N2.ToString(), *N3.ToString(), *N4.ToString());
FName 的比较操作(Equals 默认开启大小写)(== 忽略大小写)
if (N1 == N2){
UE_LOG(LogTemp, Log, TEXT("两个字符串相等"));
}if (N1.IsEqual(N2)){
UE_LOG(LogTemp, Log, TEXT("两个字符串不相等咯"));
}
FString 的检查操作:
//IsNone() 是否为空
if (N1.IsNone()){
UE_LOG(LogTemp, Log, TEXT("空字符串"));
}
//IsValid() 是否有效(空字符串也是有效的)
if (N1.IsValid()){
UE_LOG(LogTemp, Log, TEXT("有效字符串"));
}
3、 FText:显示字符串,处理用户的显式文本。支持格式化文本,方便构建国际化操作,不提供修改函数,无法进行内容修改
//六种 FText字符串 的创建方式:
#define LOCTEXT_NAMESPACE "Space" //声明LOCTEXT宏的本地文本的命名空间
void AMyGameModeBase::BeginPlay()
{
Super::BeginPlay();
//1.构建一个空白文本
FText F1 = FText::GetEmpty();
//2.使用宏构建 NSLOCTEXT(空间名称,键值名称,内容)
//(只有使用宏构建的FText 才能被文本器收集,罗列到本地的操作面板中)
FText F2 = NSLOCTEXT("UE5", "k1", "嘿哈嚯");
//3.使用宏构建 LOCTEXT(键值名称,内容)
//步骤:先声明空间名称 -> 创建对象 -> 卸载宏
FText F3 = LOCTEXT("k2", "嘿哈嚯嘿嘿");
//4.将 FString 转为 FText
//(缺点:不能被文本收集器收集)
FString str(TEXT("嘿哈嚯嘿嘿哈哈哈哈"));
FText F4 = FText::FromString(str);
//5.将 FName 转为 FText
//(缺点:也不能被文本收集器收集)
FName name(TEXT("张三三三"));
FText F5 = FText::FromName(name);
//在屏幕上输出F2"嘿哈嚯"
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, F2.ToString());
//在日志输出F2 + F3 + F4 + F5
UE_LOG(LogTemp, Log, TEXT("%s\n%s\n%s\n%s\n%s"), *F2.ToString(), *F3.ToString(), *F4.ToString(), *F5.ToString());
//6.FText 转换
//① 数字转换:数字int32 转换为 FText
FText F6_1 = FText::AsNumber(10);
//② 百分比转换:浮点0.3 转换为 FText(30%)
FText F6_2 = FText::AsPercent(0.3);
//③ 金钱转换:
FText F6_3 = FText::AsCurrency(666, TEXT("$"));
//④ 日期转换:将秒转换为年月日(单位:秒)
FText F6_4 = FText::AsDate(66666666666);
//7.FRText 的比较操作:比较两个FText是否相同
//① EqualTo():返回布尔值,不忽略大小写
if (F2.EqualTo(F3)) {}
//② EqualToCaseIgnored():忽略大小写
if (F2.EqualToCaseIgnored(F3)) {}
}
#undef LOCTEXT_NAMESPACE //卸载LOCTEXT宏
总结
以上就是今天要讲的内容,本文仅仅简单介绍了虚幻引擎中的数据类型的使用。