欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity多語言轉換工具的實現(xiàn)

 更新時間:2020年06月28日 11:32:16   作者:貝塔小可愛  
這篇文章主要為大家詳細介紹了Unity多語言轉換工具的實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Unity多語言轉換工具的具體代碼,供大家參考,具體內容如下

說明

遍歷Unity場景和Prefab,提取Text組件文字,并導出Json表??蓪son文本進行多語言翻譯后,利用工具將內容替換回原場景或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;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關文章

  • C#實現(xiàn)裝飾器模式

    C#實現(xiàn)裝飾器模式

    這篇文章介紹了C#實現(xiàn)裝飾器模式的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C#預處理器指令詳解與示例

    C#預處理器指令詳解與示例

    在軟件開發(fā)中,我們常常需要編寫可移植和可配置的代碼,C#?預處理器指令為我們提供了這樣的能力,在本篇文章中,我們將詳細介紹C#預處理器指令的定義、語法格式、功能以及在實際編程中的應用,需要的朋友可以參考下
    2024-04-04
  • C# Winform使用log4net進行日志記錄

    C# Winform使用log4net進行日志記錄

    Log4Net是從Java的log4j移植過來的,功能也與log4j類似,可以把日志信息輸出到文件、數(shù)據(jù)庫等不同的介質或目標,下面我們就來學習一下如何使用log4net進行日志記錄吧
    2023-11-11
  • C#通過xpath查找xml指定元素的方法

    C#通過xpath查找xml指定元素的方法

    這篇文章主要介紹了C#通過xpath查找xml指定元素的方法,涉及C#操作XML文件的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C#編程實現(xiàn)向并口設備發(fā)送指令、獲取并口設備的狀態(tài)

    C#編程實現(xiàn)向并口設備發(fā)送指令、獲取并口設備的狀態(tài)

    這篇文章主要介紹了C#編程實現(xiàn)向并口設備發(fā)送指令、獲取并口設備的狀態(tài),本文直接給出實例代碼,需要的朋友可以參考下
    2015-06-06
  • C# WinForm窗口最小化到系統(tǒng)托盤

    C# WinForm窗口最小化到系統(tǒng)托盤

    C#編寫最小化時隱藏為任務欄圖標的 Window appllication.
    2008-11-11
  • 深入HTTP head的使用詳解

    深入HTTP head的使用詳解

    本篇文章是對HTTP head的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C#多線程開發(fā)實戰(zhàn)記錄之線程基礎

    C#多線程開發(fā)實戰(zhàn)記錄之線程基礎

    線程是一個獨立的運行單元,每個進程內部有多個線程,每個線程可以各自同時執(zhí)行指令,每個線程有自己獨立的棧,但是與進程內的其他線程共享內存,這篇文章主要給大家介紹了關于C#多線程開發(fā)實戰(zhàn)記錄之線程基礎的相關資料,需要的朋友可以參考下
    2021-09-09
  • C#事件中的兩個參數(shù)詳解(object sender,EventArgs e)

    C#事件中的兩個參數(shù)詳解(object sender,EventArgs e)

    這篇文章主要介紹了C#事件中的兩個參數(shù)詳解(object sender,EventArgs e),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 清除aspx頁面緩存的程序實現(xiàn)方法

    清除aspx頁面緩存的程序實現(xiàn)方法

    這篇文章主要介紹了清除aspx頁面緩存的程序實現(xiàn)方法,非常實用,需要的朋友可以參考下
    2014-08-08

最新評論