From f661375604d48478ea2b0716d11c9a31c336f013 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期一, 11 五月 2026 10:53:25 +0800
Subject: [PATCH] 592 多语言适配 提交主干
---
Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs | 142 +++++++++++++++++++++++++++++++++++++++-------
1 files changed, 119 insertions(+), 23 deletions(-)
diff --git a/Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs b/Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs
index fa4b514..6590bc4 100644
--- a/Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs
+++ b/Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs
@@ -4,8 +4,6 @@
using UnityEditor.IMGUI.Controls;
using UnityEngine;
-// ======================== 鎵弿鏁版嵁妯″瀷 ========================
-
public class ImageScanResultItem
{
public string PrefabPath { get; }
@@ -44,7 +42,10 @@
public int TotalPrefabsScanned { get; set; }
public int TotalAdaptersFound { get; set; }
public int AdaptersWithMissingConfig { get; private set; }
+ public int PrefabsWithIssueCount { get; private set; }
+ public int PrefabsWithoutIssueCount { get; private set; }
public List<ImagePrefabScanResult> PrefabResults { get; } = new List<ImagePrefabScanResult>();
+ public List<ImagePrefabScanResult> PrefabResultsWithoutIssue { get; } = new List<ImagePrefabScanResult>();
public ImageScanResultSummary(string dir) => ScanDirectory = dir;
@@ -55,13 +56,31 @@
{
prefabResult = new ImagePrefabScanResult(item.PrefabPath, item.PrefabGUID);
PrefabResults.Add(prefabResult);
+ PrefabsWithIssueCount++;
}
prefabResult.Items.Add(item);
- AdaptersWithMissingConfig++;
+
+ if (item.MissingLanguages.Count > 0)
+ {
+ AdaptersWithMissingConfig++;
+ }
+ }
+
+ public void AddPrefabWithoutIssue(string path, string guid, List<ImageScanResultItem> items)
+ {
+ var prefabResult = new ImagePrefabScanResult(path, guid);
+ prefabResult.Items.AddRange(items);
+ PrefabResultsWithoutIssue.Add(prefabResult);
+ PrefabsWithoutIssueCount++;
}
}
-// ======================== TreeView 瀹炵幇 ========================
+public enum ImageScanResultFilterMode
+{
+ 鍏ㄩ儴,
+ 浠呮樉绀烘湁闂,
+ 浠呮樉绀烘棤闂
+}
public class ImageMetadataTreeViewItem : TreeViewItem
{
@@ -72,10 +91,12 @@
public class ImageScanResultTreeView : TreeView
{
private ImageScanResultSummary m_Summary;
+ private ImageScanResultFilterMode m_FilterMode;
- public ImageScanResultTreeView(TreeViewState state, ImageScanResultSummary summary) : base(state)
+ public ImageScanResultTreeView(TreeViewState state, ImageScanResultSummary summary, ImageScanResultFilterMode filterMode) : base(state)
{
m_Summary = summary;
+ m_FilterMode = filterMode;
Reload();
ExpandAll();
}
@@ -86,21 +107,60 @@
root.children = new List<TreeViewItem>();
- if (m_Summary == null || m_Summary.PrefabResults.Count == 0)
+ if (m_Summary == null)
return root;
int itemId = 1;
- foreach (var prefabResult in m_Summary.PrefabResults)
- {
- string prefabName = Path.GetFileNameWithoutExtension(prefabResult.PrefabPath);
- var prefabItem = new ImageMetadataTreeViewItem(itemId++, $"{prefabName} ({prefabResult.Items.Count}涓棶棰�)", prefabResult);
- foreach (var adapterItem in prefabResult.Items)
+ bool showWithIssue = m_FilterMode == ImageScanResultFilterMode.鍏ㄩ儴 ||
+ m_FilterMode == ImageScanResultFilterMode.浠呮樉绀烘湁闂;
+ bool showWithoutIssue = m_FilterMode == ImageScanResultFilterMode.鍏ㄩ儴 ||
+ m_FilterMode == ImageScanResultFilterMode.浠呮樉绀烘棤闂;
+
+ if (showWithIssue)
+ {
+ foreach (var prefabResult in m_Summary.PrefabResults)
{
- var adapterTreeItem = new ImageMetadataTreeViewItem(itemId++, adapterItem.GetDisplayName(), adapterItem);
- prefabItem.AddChild(adapterTreeItem);
+ string prefabName = Path.GetFileNameWithoutExtension(prefabResult.PrefabPath);
+
+ int issueCount = 0;
+ foreach (var item in prefabResult.Items)
+ {
+ if (item.MissingLanguages != null && item.MissingLanguages.Count > 0)
+ issueCount++;
+ }
+
+ var prefabItem = new ImageMetadataTreeViewItem(itemId++, $"{prefabName} ({issueCount}涓棶棰�)", prefabResult);
+
+ foreach (var adapterItem in prefabResult.Items)
+ {
+ string displayName;
+ if (adapterItem.MissingLanguages.Count > 0)
+ displayName = adapterItem.GetDisplayName();
+ else
+ displayName = $"{adapterItem.GameObjectPath} (閰嶇疆瀹屾暣)";
+ var adapterTreeItem = new ImageMetadataTreeViewItem(itemId++, displayName, adapterItem);
+ prefabItem.AddChild(adapterTreeItem);
+ }
+ root.AddChild(prefabItem);
}
- root.AddChild(prefabItem);
+ }
+
+ if (showWithoutIssue)
+ {
+ foreach (var prefabResult in m_Summary.PrefabResultsWithoutIssue)
+ {
+ string prefabName = Path.GetFileNameWithoutExtension(prefabResult.PrefabPath);
+ var prefabItem = new ImageMetadataTreeViewItem(itemId++, $"{prefabName} (鏃犻棶棰�)", prefabResult);
+
+ foreach (var adapterItem in prefabResult.Items)
+ {
+ var displayName = $"{adapterItem.GameObjectPath} (閰嶇疆瀹屾暣)";
+ var adapterTreeItem = new ImageMetadataTreeViewItem(itemId++, displayName, adapterItem);
+ prefabItem.AddChild(adapterTreeItem);
+ }
+ root.AddChild(prefabItem);
+ }
}
SetupDepthsFromParentsAndChildren(root);
@@ -114,7 +174,12 @@
if (item != null && item.Metadata is ImagePrefabScanResult)
GUI.Label(args.rowRect, item.displayName, EditorStyles.boldLabel);
else if (item != null && item.Metadata is ImageScanResultItem adapterItem)
- GUI.Label(args.rowRect, $"{adapterItem.GameObjectPath} (缂哄皯: {string.Join(", ", adapterItem.MissingLanguages)})");
+ {
+ if (adapterItem.MissingLanguages.Count > 0)
+ GUI.Label(args.rowRect, $"{adapterItem.GameObjectPath} (缂哄皯: {string.Join(", ", adapterItem.MissingLanguages)})");
+ else
+ GUI.Label(args.rowRect, item.displayName);
+ }
else
base.RowGUI(args);
}
@@ -157,8 +222,6 @@
}
}
-// ======================== 鎵弿宸ュ叿涓荤獥鍙� ========================
-
public class ImageLanguageAdapterScanTool : EditorWindow
{
private string m_ScanDirectory = "Assets";
@@ -170,6 +233,7 @@
private ImageScanResultTreeView m_TreeView;
private TreeViewState m_TreeViewState;
+ private ImageScanResultFilterMode m_ResultFilterMode = ImageScanResultFilterMode.鍏ㄩ儴;
private int m_SourceLangIndex = 0;
private int m_TargetLangIndex = 0;
@@ -275,7 +339,20 @@
if (m_ScanResult != null)
{
- EditorGUILayout.LabelField($"棰勫埗浣撴�绘暟: {m_ScanResult.TotalPrefabsScanned} | Adapter鎬绘暟: {m_ScanResult.TotalAdaptersFound} | 缂哄け閰嶇疆: {m_ScanResult.AdaptersWithMissingConfig}");
+ EditorGUILayout.LabelField($"棰勫埗浣撴�绘暟: {m_ScanResult.TotalPrefabsScanned} | 鏈堿dapter鐨勯鍒朵綋: {m_ScanResult.PrefabsWithIssueCount + m_ScanResult.PrefabsWithoutIssueCount} | Adapter鎬绘暟: {m_ScanResult.TotalAdaptersFound} | 缂哄け閰嶇疆: {m_ScanResult.AdaptersWithMissingConfig} | 鏈夐棶棰橀鍒朵綋: {m_ScanResult.PrefabsWithIssueCount} | 鏃犻棶棰橀鍒朵綋: {m_ScanResult.PrefabsWithoutIssueCount}");
+ EditorGUILayout.Space(5f);
+
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ EditorGUILayout.LabelField("鏄剧ず妯″紡:", GUILayout.Width(60f));
+ EditorGUI.BeginChangeCheck();
+ m_ResultFilterMode = (ImageScanResultFilterMode)EditorGUILayout.EnumPopup(m_ResultFilterMode);
+ if (EditorGUI.EndChangeCheck() && m_TreeView != null)
+ {
+ m_TreeViewState ??= new TreeViewState();
+ m_TreeView = new ImageScanResultTreeView(m_TreeViewState, m_ScanResult, m_ResultFilterMode);
+ }
+ }
EditorGUILayout.Space(5f);
if (m_TreeView != null)
@@ -450,7 +527,7 @@
}
m_TreeViewState ??= new TreeViewState();
- m_TreeView = new ImageScanResultTreeView(m_TreeViewState, m_ScanResult);
+ m_TreeView = new ImageScanResultTreeView(m_TreeViewState, m_ScanResult, m_ResultFilterMode);
m_ScanStatus = $"鎵弿瀹屾垚! 鍙戠幇 {m_ScanResult.AdaptersWithMissingConfig} 涓己澶遍厤缃�";
Repaint();
}
@@ -461,8 +538,12 @@
if (prefab == null) return;
var adapters = prefab.GetComponentsInChildren<ImageLanguageAdapter>(true);
+ if (adapters.Length == 0) return;
m_ScanResult.TotalAdaptersFound += adapters.Length;
+
+ bool hasIssue = false;
+ List<ImageScanResultItem> allItems = new List<ImageScanResultItem>();
foreach (var adapter in adapters)
{
@@ -473,15 +554,30 @@
if (!adapter.HasConfig(langId)) missing.Add(langId);
}
+ var item = new ImageScanResultItem(path, GetGameObjectPath(adapter.gameObject, prefab), adapter.TargetImageType, guid)
+ {
+ MissingLanguages = missing
+ };
+
+ allItems.Add(item);
+
if (missing.Count > 0)
{
- var item = new ImageScanResultItem(path, GetGameObjectPath(adapter.gameObject, prefab), adapter.TargetImageType, guid)
- {
- MissingLanguages = missing
- };
+ hasIssue = true;
+ }
+ }
+
+ if (hasIssue)
+ {
+ foreach (var item in allItems)
+ {
m_ScanResult.AddResult(item);
}
}
+ else
+ {
+ m_ScanResult.AddPrefabWithoutIssue(path, guid, allItems);
+ }
}
private string GetGameObjectPath(GameObject go, GameObject root)
--
Gitblit v1.8.0