Unity多語(yǔ)言轉(zhuǎn)換工具的實(shí)現(xiàn)
本文實(shí)例為大家分享了Unity多語(yǔ)言轉(zhuǎn)換工具的具體代碼,供大家參考,具體內(nèi)容如下
說(shuō)明
遍歷Unity場(chǎng)景和Prefab,提取Text組件文字,并導(dǎo)出Json表。可將Json文本進(jìn)行多語(yǔ)言翻譯后,利用工具將內(nèi)容替換回原場(chǎng)景或Prefab。
代碼
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class ChangeTextLanguageTool : MonoBehaviour
{
[ExecuteInEditMode]
[MenuItem("LanguageTool/一鍵提取Prefab中文字")]
private static void GetAllPrefab()
{
LoadPath(Application.dataPath);
}
static void LoadPath(string path)
{
TextData _temData = new TextData();
string genPath = path;
string[] filesPath = Directory.GetFiles(genPath, "*.prefab", SearchOption.AllDirectories);
for (int i = 0; i < filesPath.Length; i++)
{
PrefabData _tempPrefab = new PrefabData();
filesPath[i] = filesPath[i].Substring(filesPath[i].IndexOf("Assets"));
GameObject _prefab = AssetDatabase.LoadAssetAtPath(filesPath[i], typeof(GameObject)) as GameObject;
GameObject prefabGameobject = PrefabUtility.InstantiatePrefab(_prefab) as GameObject;
_tempPrefab.PrefabName = prefabGameobject.name;
Text[] _tempAllText = prefabGameobject.transform.GetComponentsInChildren<Text>(true);
for (int j = 0; j < _tempAllText.Length; j++)
{
if (!string.IsNullOrEmpty(_tempAllText[j].text))
{
TextItemData _tempItemdata = new TextItemData();
_tempItemdata._ObjName = _tempAllText[j].gameObject.name;
_tempItemdata._TextContext = _tempAllText[j].text;
_tempPrefab._PrefabData.Add(_tempItemdata);
}
}
if (_tempPrefab._PrefabData.Count > 0)
_temData.Data.Add(_tempPrefab);
Debug.Log("遍歷完成===========" + prefabGameobject.name);
MonoBehaviour.DestroyImmediate(prefabGameobject);
}
string[] ScenePath = Directory.GetFiles(genPath, "*.unity", SearchOption.AllDirectories);
for (int i = 0; i < ScenePath.Length; i++)
{
PrefabData _tempPrefab = new PrefabData();
ScenePath[i] = ScenePath[i].Substring(ScenePath[i].IndexOf("Assets"));
Debug.Log(ScenePath[i]);
if (ScenePath[i].Contains("Live2D"))
continue;
_tempPrefab.PrefabName = ScenePath[i];
EditorSceneManager.OpenScene(ScenePath[i], OpenSceneMode.Single);
var _temp = Resources.FindObjectsOfTypeAll(typeof(Text)) as Text[];
//_temp.Select(data => data.gameObject.scene.isLoaded);
foreach (Text obj in _temp)
{
if(!obj.gameObject.scene.isLoaded)
continue;
//Debug.LogError(obj.text);
if (!string.IsNullOrEmpty(obj.text))
{
TextItemData _tempItemdata = new TextItemData();
_tempItemdata._ObjName = obj.gameObject.name;
_tempItemdata._TextContext = obj.text;
_tempPrefab._PrefabData.Add(_tempItemdata);
}
}
if (_tempPrefab._PrefabData.Count > 0)
_temData.Data.Add(_tempPrefab);
}
Save(_temData);
}
static void Save(TextData data)
{
string Path = Application.dataPath + "/LanguageTool.json";
/*if (!File.Exists(Path))
File.Create(Path);*/
string json = JsonUtility.ToJson(data);
File.WriteAllText(Path, json);
EditorUtility.DisplayDialog("成功", "Prefab文本提取處理成功", "確定");
}
static Dictionary<string, PrefabData> m_dicTextData = new Dictionary<string, PrefabData>();
[ExecuteInEditMode]
[MenuItem("LanguageTool/一鍵替換LanguageTool字體")]
static void ChangText()
{
TextAsset text = Resources.Load<TextAsset>("LanguageTool");
TextData _data = JsonUtility.FromJson<TextData>(text.text);
m_dicTextData = new Dictionary<string, PrefabData>();
foreach (var item in _data.Data)
{
m_dicTextData[item.PrefabName] = item;
}
/*ChangeLabelText(Application.dataPath + "/App");
ChangeLabelText(Application.dataPath + "/Cosmos");
ChangeLabelText(Application.dataPath + "/Scenes");*/
ChangeLabelText(Application.dataPath);
EditorUtility.DisplayDialog("成功", "替換成功", "確定");
}
static void ChangeLabelText(string path)
{
string genPath = path;
int m = 0;
string[] filesPath = Directory.GetFiles(genPath, "*.prefab", SearchOption.AllDirectories);
for (int i = 0; i < filesPath.Length; i++)
{
filesPath[i] = filesPath[i].Substring(filesPath[i].IndexOf("Assets"));
GameObject _prefab = AssetDatabase.LoadAssetAtPath(filesPath[i], typeof(GameObject)) as GameObject;
GameObject prefabGameobject = PrefabUtility.InstantiatePrefab(_prefab) as GameObject;
PrefabData _tempData = null;
if (m_dicTextData.ContainsKey(prefabGameobject.name))
{
_tempData = m_dicTextData[prefabGameobject.name];
}
Text[] _tempAllText = prefabGameobject.transform.GetComponentsInChildren<Text>(true);
for (int j = 0; j < _tempAllText.Length; j++)
{
if (!string.IsNullOrEmpty(_tempAllText[j].text))
{
if (null != _tempData && _tempData._PrefabData.Count > 0)
{
for (int z = 0; z < _tempData._PrefabData.Count; z++)
if (_tempData._PrefabData[z]._ObjName == _tempAllText[j].gameObject.name)
{
_tempAllText[j].text = _tempData._PrefabData[z]._TextContext;
_tempData._PrefabData.RemoveAt(z);
break;
}
}
}
}
PrefabUtility.SaveAsPrefabAsset(prefabGameobject, filesPath[i]);
Debug.Log("遍歷完成===========" + prefabGameobject.name);
MonoBehaviour.DestroyImmediate(prefabGameobject);
AssetDatabase.SaveAssets();
}
string[] ScenePath = Directory.GetFiles(genPath, "*.unity", SearchOption.AllDirectories);
for (int i = 0; i < ScenePath.Length; i++)
{
ScenePath[i] = ScenePath[i].Substring(ScenePath[i].IndexOf("Assets"));
Debug.Log(ScenePath[i]);
if (ScenePath[i].Contains("Live2D"))
continue;
PrefabData _tempData = null;
if (m_dicTextData.ContainsKey(ScenePath[i]))
{
_tempData = m_dicTextData[ScenePath[i]];
}
Scene _tempScene = EditorSceneManager.OpenScene(ScenePath[i], OpenSceneMode.Single);
//foreach (Text obj in UnityEngine.Object.FindObjectsOfType(typeof(Text)))
var _temp = Resources.FindObjectsOfTypeAll(typeof(Text)) as Text[];
//_temp.Select(data => data.gameObject.scene.isLoaded);
foreach (Text obj in _temp)
{
if(!obj.gameObject.scene.isLoaded)
continue;
if (!string.IsNullOrEmpty(obj.text))
{
if (null != _tempData && _tempData._PrefabData.Count > 0)
{
for (int z = 0; z < _tempData._PrefabData.Count; z++)
if (_tempData._PrefabData[z]._ObjName == obj.gameObject.name)
{
obj.text = _tempData._PrefabData[z]._TextContext;
_tempData._PrefabData.RemoveAt(z);
break;
}
}
}
}
EditorSceneManager.SaveScene(_tempScene);
AssetDatabase.SaveAssets();
}
}
}
[Serializable]
public class TextData
{
public List<PrefabData> Data = new List<PrefabData>();
}
[Serializable]
public class PrefabData
{
public string PrefabName = string.Empty;
public List<TextItemData> _PrefabData = new List<TextItemData>();
}
[Serializable]
public class TextItemData
{
public string _ObjName = string.Empty;
public string _TextContext = string.Empty;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用隊(duì)列(Queue)解決簡(jiǎn)單的并發(fā)問(wèn)題
這篇文章主要介紹了使用隊(duì)列(Queue)解決簡(jiǎn)單的并發(fā)問(wèn)題,講解的很細(xì)致,喜歡的朋友們可以了解一下2015-07-07
通過(guò)LinQ查詢字符出現(xiàn)次數(shù)的實(shí)例方法
這篇文章主要介紹了通過(guò)LinQ查詢字符出現(xiàn)次數(shù)的實(shí)例方法,大家參考使用吧2013-11-11
C#實(shí)現(xiàn)按照指定長(zhǎng)度在數(shù)字前補(bǔ)0方法小結(jié)
這篇文章主要介紹了C#實(shí)現(xiàn)按照指定長(zhǎng)度在數(shù)字前補(bǔ)0方法,實(shí)例總結(jié)了兩個(gè)常用的數(shù)字補(bǔ)0的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
C# 如何使用 Index 和 Range 簡(jiǎn)化集合操作
這篇文章主要介紹了C# 如何使用 Index 和 Range 簡(jiǎn)化集合操作,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02
C#實(shí)現(xiàn)ComboBox控件顯示出多個(gè)數(shù)據(jù)源屬性的方法
這篇文章主要介紹了C#實(shí)現(xiàn)ComboBox控件顯示出多個(gè)數(shù)據(jù)源屬性的方法,實(shí)例分析了ComboBox控件的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09

