From 2d61e2d96f9273579d93f1072f89a59ecf3545c1 Mon Sep 17 00:00:00 2001 From: Soviby <936858871@qq.com> Date: Thu, 10 Oct 2024 00:12:59 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E6=9E=90=20layout.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Editor/EditorDefine.cs | 38 -------- Assets/Editor/Helper/LayoutParser.cs | 93 +++++++++++++++++++ Assets/Editor/Helper/LayoutParser.cs.meta | 11 +++ .../Editor/ScriptObject/CacheScriptObject.cs | 21 ++++- Assets/Editor/Windows/PanelCacheWindow.cs | 19 ++++ 5 files changed, 143 insertions(+), 39 deletions(-) create mode 100644 Assets/Editor/Helper/LayoutParser.cs create mode 100644 Assets/Editor/Helper/LayoutParser.cs.meta diff --git a/Assets/Editor/EditorDefine.cs b/Assets/Editor/EditorDefine.cs index 9b3191f..e00d6de 100644 --- a/Assets/Editor/EditorDefine.cs +++ b/Assets/Editor/EditorDefine.cs @@ -16,42 +16,4 @@ namespace UguiToolkit.Editor public float rot; public float[] scale; } - - [Serializable] - public class LayoutJsonData - { - public LayoutInfoJsonData info; - public LayoutElementJsonData root; - } - - [Serializable] - public class LayoutInfoJsonData - { - public string version; - public CanvasInfoJsonData canvas; - - [Serializable] - public class CanvasInfoJsonData - { - public CanvasSizeJsonData size; - [Serializable] - public struct CanvasSizeJsonData - { - public float w; - public float h; - } - } - } - - [Serializable] - public class LayoutElementJsonData - { - public string type; - public string name; - public float x; - public float y; - public float w; - public float h; - public List element; - } } \ No newline at end of file diff --git a/Assets/Editor/Helper/LayoutParser.cs b/Assets/Editor/Helper/LayoutParser.cs new file mode 100644 index 0000000..8602bf1 --- /dev/null +++ b/Assets/Editor/Helper/LayoutParser.cs @@ -0,0 +1,93 @@ + +using System.Collections.Generic; +using System; +using Newtonsoft.Json; +using UnityEngine; + +namespace UguiToolkit.Editor +{ + public interface ILayoutParser + { + LayoutInfo Parser(string txt); + } + + public class DefaultLayoutParser : ILayoutParser + { + public LayoutInfo Parser(string txt) + { + var layoutJsonData = JsonConvert.DeserializeObject(txt); + List elementInfos = new(); + LayoutInfo layoutInfo = new(elementInfos, layoutJsonData.info.canvas.size.w, layoutJsonData.info.canvas.size.h); + + void AddElementInfo(LayoutElementJsonData layoutElementJsonData) + { + if (layoutElementJsonData.type == "Image") + { + elementInfos.Add(new LayoutInfo.ImageInfo() + { + imgPath = layoutElementJsonData.imageName, + x = layoutElementJsonData.x, + y = layoutElementJsonData.y, + w = layoutElementJsonData.w, + h = layoutElementJsonData.h, + layoutInfo = layoutInfo + }); + } + else if (layoutElementJsonData.type == "Text") + { + // TODO + + } + + if (layoutElementJsonData.elements != null) + { + foreach (var e in layoutElementJsonData.elements) AddElementInfo(e); + } + } + AddElementInfo(layoutJsonData.root); + + return layoutInfo; + } + } + + [Serializable] + public class LayoutJsonData + { + public LayoutInfoJsonData info; + public LayoutElementJsonData root; + } + + [Serializable] + public class LayoutInfoJsonData + { + public string version; + public CanvasInfoJsonData canvas; + + [Serializable] + public class CanvasInfoJsonData + { + public CanvasSizeJsonData size; + [Serializable] + public struct CanvasSizeJsonData + { + public float w; + public float h; + } + } + } + + [Serializable] + public class LayoutElementJsonData + { + public string type; + public string name; + public float x; + public float y; + public float w; + public float h; + public List elements; + + + public string imageName; + } +} diff --git a/Assets/Editor/Helper/LayoutParser.cs.meta b/Assets/Editor/Helper/LayoutParser.cs.meta new file mode 100644 index 0000000..fe3d96c --- /dev/null +++ b/Assets/Editor/Helper/LayoutParser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e115306ce3d6eb548b614ed589b175b3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/ScriptObject/CacheScriptObject.cs b/Assets/Editor/ScriptObject/CacheScriptObject.cs index ea85935..1923374 100644 --- a/Assets/Editor/ScriptObject/CacheScriptObject.cs +++ b/Assets/Editor/ScriptObject/CacheScriptObject.cs @@ -45,8 +45,19 @@ namespace UguiToolkit.Editor [Serializable] public class LayoutInfo { + private List m_elementInfos; + private float m_w; + private float m_h; + public float W => m_w; + public float H => m_h; + public LayoutInfo(List elementInfos, float w, float h) + { + this.m_elementInfos = elementInfos; + this.m_w = w; + this.m_h = h; + } public class ElementInfo { @@ -55,8 +66,16 @@ namespace UguiToolkit.Editor public float w; public float h; + public LayoutInfo layoutInfo; - public float3 position; + public float2 Position { + get { + float x = (layoutInfo.W / 2f) * -1 + this.x + this.w / 2f; + float y = layoutInfo.H / 2f - this.y - this.h / 2f; + + return new float2(x, y); + } + } } public class ImageInfo : ElementInfo diff --git a/Assets/Editor/Windows/PanelCacheWindow.cs b/Assets/Editor/Windows/PanelCacheWindow.cs index eeb865e..5d1b32e 100644 --- a/Assets/Editor/Windows/PanelCacheWindow.cs +++ b/Assets/Editor/Windows/PanelCacheWindow.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO; using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using Unity.Mathematics; @@ -33,6 +34,7 @@ namespace UguiToolkit.Editor.Windows { panelCache.rotScaleInfos = new(); CalcRotScaleInfos(); + PaserLayout(); } var cache = GlobalManager.Instance.cache; @@ -42,6 +44,22 @@ namespace UguiToolkit.Editor.Windows CloseWindow(); } + [Button("解析Layout.txt", ButtonSizes.Medium), ShowIf(nameof(m_cacheExist))] + private void PaserLayout() + { + if (string.IsNullOrEmpty(m_layoutInfoFilePath)) + { + Debug.LogError("layoutInfoFilePath 为空"); + return; + } + ILayoutParser layoutParser = new DefaultLayoutParser(); + using (StreamReader reader = File.OpenText(m_layoutInfoFilePath)) + { + var jsonData = reader.ReadToEnd(); + layoutParser.Parser(jsonData); + } + } + [Button("重新计算旋转和缩放信息", ButtonSizes.Medium), ShowIf(nameof(m_cacheExist))] private void CalcRotScaleInfos() { @@ -103,5 +121,6 @@ namespace UguiToolkit.Editor.Windows _window = null; } } + } } \ No newline at end of file