[UE4入门笔记(3)] 7.本地化 8.UE4反射 9.语言切换功能 --梁迪老师UE4纯C++&Slate开发沙盒游戏

前言:

笔者目前在校本科大三,目标方向是人工智能、计算机视觉。上一个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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值