using System.Collections.Generic; using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using Unity.Mathematics; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.Serialization; namespace UguiToolkit.Editor.Windows { public class PanelCacheWindow : OdinEditorWindow { private static PanelCacheWindow _window; [LabelText("源图片文件夹路径"), FolderPath, SerializeField] private string m_srcImgDirPath; [LabelText("目标图片信息文件(psd导出)"), Sirenix.OdinInspector.FilePath(Extensions = "layout.txt"), SerializeField] private string m_layoutInfoFilePath; private PrefabStage m_prefabStage; private GameObject m_prefab; private bool m_cacheExist; private PanelCache panelCache; [Button("开启助手", ButtonSizes.Medium)] private void Start() { panelCache.srcImgDirPath = m_srcImgDirPath; panelCache.layoutInfoFilePath = m_layoutInfoFilePath; if (!m_cacheExist) { panelCache.rotScaleInfos = new(); CalcRotScaleInfos(); } var cache = GlobalManager.Instance.cache; cache.panelCaches[m_prefab] = panelCache; UguiToolkit.StageManager.CreateStageManager(m_prefabStage.scene, m_prefabStage.prefabContentsRoot); CloseWindow(); } [Button("重新计算旋转和缩放信息", ButtonSizes.Medium), ShowIf(nameof(m_cacheExist))] private void CalcRotScaleInfos() { // 执行cmd var jsonData = CommandHelper.CalcRotScale(panelCache.srcImgDirPath, panelCache.TargetImgDirPath, panelCache.rotScaleInfos); if (jsonData == null || jsonData.data == null) return; var rotScaleInfos = panelCache.rotScaleInfos; foreach (var kv in jsonData.data) { List rotScaleItemList = new(); rotScaleInfos[kv.Key] = rotScaleItemList; foreach (var jsonItemData in kv.Value) { rotScaleItemList.Add(new () { imgPath = jsonItemData.targetPath, rotiation = jsonItemData.rot, scale = new float2(jsonItemData.scale[0], jsonItemData.scale[1]) }); } } } private void Init() { var cache = GlobalManager.Instance.cache; if (cache.panelCaches.TryGetValue(m_prefab, out panelCache)) { m_srcImgDirPath = panelCache.srcImgDirPath; m_layoutInfoFilePath = panelCache.layoutInfoFilePath; m_cacheExist = true; } else { panelCache = new PanelCache(); } } public static PanelCacheWindow ShowWindow(PrefabStage stage) { if (_window) _window.Close(); _window = CreateWindow(); _window.titleContent = new ("请选择信息后开启助手"); _window.m_prefabStage = stage; _window.m_prefab = AssetDatabase.LoadAssetAtPath(stage.assetPath); _window.Show(); _window.Init(); return _window; } public static void CloseWindow() { if (_window) { _window.Close(); _window = null; } } } }