当前位置: 首页 > news >正文

【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用

文章目录

  • 前言
  • 优缺点
      • 优点
      • 缺点
  • 安装
  • 创建配置
  • 选择语言
  • 选择默认语言
  • 创建多语言表数据
  • 创建key
  • 配置不同语言文本
  • 预加载
  • 绑定不同多语言文本数据,并显示
  • 语言切换
  • 自己编写按钮控制语言切换
  • 多语言图片切换
  • 在构建中使用Localization
  • 分析错误修复
  • 动态修改多语言文本内容
  • 参考
  • 推荐
  • 完结

注意:学习本教程的第一件事是拥有Unity2021.2或更高版本。

前言

游戏先要国际化,实现多语言切换是必不可少的功能,本文将重点关注一款名为Localization的插件。该插件为Unity开发者提供了一种简单而强大的方式来实现应用程序的多语言支持。通过使用本文提供的技巧和指南,你将能够轻松地为你的游戏或应用程序集成多语言切换功能,从而为全球用户提供更加友好和个性化的体验。

在本文中,我们将深入探讨Localization插件的使用方法、优势和注意事项。我们将从导入插件开始,逐步引导你完成设置语言文件、在代码中使用本地化文本等操作。除此之外,我们还将分享一些实用的小贴士和最佳实践,帮助你充分发挥Localization插件的潜力。

无论你是刚入门Unity开发,还是想要为现有项目添加多语言支持,本文都将为你提供宝贵的经验和见解。让我们一起开始,探索如何利用Localization插件为你的Unity应用添加多语言支持吧!

优缺点

优点

  1. 简化多语言支持:本地化插件可以大大简化在应用程序中实现多语言支持的工作,使得开发者能够更容易地管理和维护多语言文本。

  2. 灵活性:一些本地化插件提供了灵活的配置选项,允许开发者根据需求进行定制化设置,比如动态切换语言、支持富文本等。

  3. 社区支持:一些知名的本地化插件拥有庞大的用户群体和活跃的社区支持,能够提供丰富的文档、教程和解决方案,帮助开发者解决本地化中遇到的问题。

缺点

  1. 学习成本:使用新的本地化插件可能需要一定的学习成本,尤其是熟悉插件的API和工作流程。这可能会增加项目开发的时间和成本。

  2. 依赖性:部分本地化插件可能存在版本更新不及时、兼容性问题或者依赖其他库的情况,需要开发者谨慎考虑项目的依赖性。

  3. 性能:不同的本地化插件可能会对应用程序的性能产生不同程度的影响,特别是在多语言文本较多的情况下需要注意性能损耗。

安装

在这里插入图片描述

创建配置

在这里插入图片描述
在这里插入图片描述

选择语言

在这里插入图片描述

选择默认语言

在这里插入图片描述
这个也设置为英语
在这里插入图片描述

创建多语言表数据

在这里插入图片描述
在这里插入图片描述

创建key

在这里插入图片描述

在这里插入图片描述

配置不同语言文本

在这里插入图片描述

预加载

确保开启了预加载功能
在这里插入图片描述

绑定不同多语言文本数据,并显示

在这里插入图片描述
绑定文本显示事件
在这里插入图片描述
运行效果
在这里插入图片描述

语言切换

右上角切换语言
在这里插入图片描述

自己编写按钮控制语言切换

实际应用我们肯定不会使用自带的语言切换功能,而是自己代码控制
_localeID对应配置语言的索引
1

using UnityEngine;
using UnityEngine.Localization.Settings; // 确保包含 UnityEngine.Localization.Settings 命名空间public class LocaleSelector : MonoBehaviour
{private bool active = false; // 用于跟踪是否正在进行语言环境更改的变量// 方法:根据 LocaleID 更改语言环境public void ChangeLocale(int localeID){if (active) // 如果已经有语言环境更改正在进行,直接退出方法return;StartCoroutine(SetLocale(localeID)); // 启动协程来设置新的语言环境}// 协程:异步设置语言环境IEnumerator SetLocale(int _localeID){active = true; // 设置 active 为 true,表示语言环境更改正在进行中yield return LocalizationSettings.InitializationOperation; // 等待本地化系统初始化完成// 根据 _localeID 设置选定的语言环境LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[_localeID];active = false; // 语言环境更改完成后,重置 active 为 false}
}

配置
在这里插入图片描述
在这里插入图片描述
当然,要记住玩家选译的语言,你需要保存localeID,并在游戏开始时加载对应的语言
在这里插入图片描述

多语言图片切换

新增Asset Table Collection表格数据
在这里插入图片描述
这里使用另外方式配置数据,也就是直接在编辑框配置修改内容
在这里插入图片描述
可以看到表内同步配置好了内容
在这里插入图片描述
同样绑定更新事件
在这里插入图片描述
效果
在这里插入图片描述

在构建中使用Localization

我们还需要做一件事来在构建中使用Localization.
在这里插入图片描述
新增资源
在这里插入图片描述
如果你已经新增过资源,可以选择更新
在这里插入图片描述
清理
在这里插入图片描述

分析错误修复

分析窗口
在这里插入图片描述
点击分析
在这里插入图片描述
如果你发现任何错误,请尝试使用“修复所选规则”按钮修复它们。
在这里插入图片描述

动态修改多语言文本内容

打开多语言表,配置新的内容
在这里插入图片描述

{0}可以理解为我们要动态修改的内容占位
在这里插入图片描述
关键是选中这个“智能”复选框。这将允许我们通过代码改变值
在这里插入图片描述代码控制

using UnityEngine;
using UnityEngine.Localization;
using TMPro;public class ChangeScore : MonoBehaviour
{[SerializeField] private LocalizedString localStringScore; // 用于本地化的字符串[SerializeField] private TextMeshProUGUI textComp; // 用于显示分数的 TextMeshPro 组件private int score; // 分数变量// Unity 消息:在对象启用时调用private void OnEnable(){// 设置本地化字符串的参数localStringScore.Arguments = new object[] { score };// 订阅本地化字符串变化的事件localStringScore.StringChanged += UpdateText;}// Unity 消息:在对象禁用时调用private void OnDisable(){// 取消订阅本地化字符串变化的事件localStringScore.StringChanged -= UpdateText;}// 更新文本的方法,参数为新的字符串值private void UpdateText(string value){textComp.text = value; // 更新 TextMeshPro 组件的文本}// 增加分数的方法public void IncreaseScore(){score++; // 增加分数localStringScore.Arguments[0] = score; // 更新本地化字符串的参数localStringScore.RefreshString(); // 刷新本地化字符串以应用新的参数}
}

配置
在这里插入图片描述
增加分数按钮配置点击事件
在这里插入图片描述
效果
在这里插入图片描述

参考

https://www.youtube.com/watch?v=XLv79XcbYXc

推荐

欢迎关注《100个unity插件系列》专栏,不定期持续产出内容:推荐100个unity插件

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

相关文章:

  • 命名冲突常见的领域
  • 红队内网攻防渗透:内网渗透之内网对抗:隧道技术篇防火墙组策略ICMPDNSSMB协议出网判断C2上线解决方案
  • 利用第三方服务对目标进行被动信息收集防止被发现(web安全白帽子)
  • 剪画音频提取:周杰伦音乐自由听,谁还付费听歌呀!
  • 6G时代,即将来临!
  • 课程管理系统
  • Stable Diffusion部署教程,开启你的AI绘图之路
  • Qt项目天气预报(4) - json 数据解析
  • 可灵王炸更新,图生视频、视频续写,最长可达3分钟!Runway 不香了 ...
  • 【FreeRTOS】删除任务 用遥控器控制音乐
  • Linux中的TCP与UDP:理解两者的差异
  • 生活实用口语柯桥成人外语培训机构“客服”用英文怎么说?
  • 服务器SSH 免密码登录
  • 计算机网络(概述)
  • nginx的rev->handler的更新历程
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Consul Config 使用Git做版本控制的实现
  • Intervention/image 图片处理扩展包的安装和使用
  • javascript数组去重/查找/插入/删除
  • Js基础知识(四) - js运行原理与机制
  • LeetCode29.两数相除 JavaScript
  • markdown编辑器简评
  • SAP云平台里Global Account和Sub Account的关系
  • Solarized Scheme
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 订阅Forge Viewer所有的事件
  • 反思总结然后整装待发
  • 悄悄地说一个bug
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • linux 淘宝开源监控工具tsar
  • 第二十章:异步和文件I/O.(二十三)
  • #考研#计算机文化知识1(局域网及网络互联)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (30)数组元素和与数字和的绝对差
  • (java)关于Thread的挂起和恢复
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二十四)Flask之flask-session组件
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (三)docker:Dockerfile构建容器运行jar包
  • (一)Neo4j下载安装以及初次使用
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Sublime Text3配置Lua运行环境
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET MVC第三章、三种传值方式
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net程序帮助文档制作