前言:
笔者目前在校本科大三,目标方向是人工智能、计算机视觉。上一个OpenCV学习笔记专栏已完结,在学习完OpenCV后,我继续学习C++,并用纯C++做UE4项目的方式继续提升自己的水平。
梁迪老师的水平非常高,他的课程本来也无需笔记:课程本身即为最好的笔记。但由于我天赋有限,还是边看边记,以防遗忘——知识点太多,步骤太繁杂了。在学习过程中,我也偶有思考,思索为什么某个方法老师要这样做。所以,一是为了记录,二是为了分享,才有了这个专栏。
内容方面,由于我在开启这个专栏时,此项目已经做完很多了。所以,前期的一些大篇幅叙述的知识,可能在后期应用中一带而过。以及,前期的一些知识,后期会重新剖析,并加上我的个人理解。
另外,若有学术交流/学业交流意愿,可以邮件联系1246210283@qq.com,希望一齐进步。
本篇学习内容:
7.本地化
8.UE4反射
9.语言切换功能
7.本地化
Text()用于创建一个通用的String类型,如:Text(“Hello”)
LOCTEXT() 创建一个本地化文字,如:LOCTEXT(“Name”,“Hello”)
NSLOCTEXT() 在一个域名空间内的本地化,如:NSLOCTEXT(“Namespace”,“Name”,“Hello”)
8.UE4反射
UCLASS() 告知虚幻引擎生成类的反射数据。类必须派生自UObject
USTRUCT() 告知虚幻引擎生成结构体的反射数据。
GENERATED_BODY() UE4使用它替代为类型生成的所有必需样板文件代码。
UPROPERTY() 使UCLASS或USTRUCT的成员变量可用作UPROPERTY。UPROPERTY用途广泛。它允许变量被复制、被序列化、并可从蓝图中进行访问。垃圾回收器还使用它们来追踪对UObject的引用数。
UFUNCTION() 使UCLASS或USTRUCT的类方法可用作UFUNCTION。UFUNCTION允许类方法从蓝图中被调用,并在其他资源中用作RPC
UENUM()创建可以被蓝图调用的enum反射
*这些东西在C++里创建之后意味着UE4的编译器会编译出蓝图能够使用的相对应的enum/class类型
以下摘自https://blog.csdn.net/u012999985/article/details/52902065:
在UE4中,基本上所有的游戏工程的类都会用到反射。比如,你用编辑器新建一个类,类的前面会自动添加UCLASS();新建一个结构体,需要使用USTRUCT();新建一个枚举变量,需要在前面声明UENUM();在类的里面,也必须要加上GENERATED_UCLASS_BODY()才行。
如果你想让你的变量能显示在编辑器里面,想让你的函数可以被蓝图调用或者通过让这个函数实现RPC网络通信功能,或者你想让你的变量被系统自动的回收,这些都离不开反射系统以及这些宏定义。
所以,我们这里起码能认识到,在网络通信,蓝图交互以及垃圾回收方面,这与反射系统是密不可分的。
9.语言切换功能
在SAssignNew的STextBlock中的.Text中中英文夹杂,会导致中文乱码,显示不出中文。
如何解决:
(1)在VS的高级保存选项中修改编码为UTF-8
(2)用UE4自带的本地化功能:
1.在TEXT中:
SlAiInternation::Register(LOCTEXT("Menu", "Menu"));
注:这个TEXT是在SlAiInternation.h下写的。后面可以准备好所有的文本,都放在该文件下,然 后去UE4编辑器内统一翻译。
2.运行代码,在UE4编辑器中,Window - Localization Dashboard 下 :Gather Text 的 Search Directories 中 添加目标路径
3.Cultures中添加中文,并设置本土语言为英文
4.点击Gather Text
5.在英文的 Edit Translations… 中即可看到找到的本地化文字
6.在中文的 Edit Translations… 中,在未翻译栏目下可以进行翻译,翻译之后保存
7.在Localization Dashboard的Cultures中点击Count Words,再点击Compile Text。这会让UE4 将它编译到自己的格式文件里面
关于如何在游戏中切换中英文,也用代码实现。
在游戏中显示英文:
在SSlAiMenuWidget.cpp中:
#include "Internationalization.h"
Construct函数中:
FInternationalization::Get().SetCurrentCulture(TEXT("en"));
正式实现语言切换功能:
(1)准备好所有文本并翻译
(2)新建两个C++类:SlAiTypes、SlAiDataHandle
(3)在Types中做一个枚举
UENUM()
enum class ECultureTeam : uint8 {
EN = 0,
ZH
};
(4)在DataHandle中准备函数:模仿SlAiStyle来写;Initialize、Get、Create等
(5)在DataHandle中设置一个变量
ECultureTeam CurrentCulture
(6)写SlAiDataHandle::ChangeLocalizationCulture(ECultureTeam Culture)函数:
switch (Culture)
{
case ECultureTeam::EN:
FInternationalization::Get().SetCurrentCulture(TEXT("en"));
break;
case ECultureTeam::ZH:
FInternationalization::Get().SetCurrentCulture(TEXT("zh"));
break;
}
//赋值
CurrentCulture = Culture;