#if UNITY_EDITOR using Sirenix.OdinInspector; using System; using UguiToolkit.Editor; using Unity.Mathematics; using UnityEditor; using UnityEngine; using UnityEngine.UI; namespace UguiToolkit.Editor { public class ImageEntity : BaseEntity { [ShowInInspector] private float rotiation; [ShowInInspector] private float2 scale; [ShowInInspector] private bool similarityCalc; [ShowInInspector] private bool needFillTransform; [ShowInInspector] private Matrix4x4 lastTransformMatrix; private Image m_previewImage; // 查找时调用 public void SetTransform(float rotiation, float2 scale, bool similarityCalc) { this.rotiation = rotiation; this.scale = scale; this.similarityCalc = similarityCalc; this.needFillTransform = true; } private void LoadImageFromFile(string path) { if (System.IO.File.Exists(path)) { byte[] fileData = System.IO.File.ReadAllBytes(path); Texture2D texture = new Texture2D(2, 2); texture.LoadImage(fileData); // 加载图片数据到Texture2D Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); m_previewImage.sprite = sprite; m_previewImage.color = new Color(1, 1, 1, 0.5f); m_previewImage.SetNativeSize(); } else { Debug.LogError("File not found at path: " + path); } } protected override void OnApplyData(Image ui) { if (ElementInfo.HaveSlice) { ui.type = Image.Type.Sliced; } } public override void InitPreview() { if (ElementInfo == null) return; if (!TryGetComponent(out m_previewImage)) { m_previewImage = gameObject.AddComponent(); m_previewImage.type = Image.Type.Simple; } LoadImageFromFile(ElementInfo.imgPath); ApplyTransform(transform); } protected override void OnApplyTransform(Transform tf) { var rt = tf as RectTransform; if (needFillTransform) { var pos = ElementInfo.Position; var worldPos = StageManager.Instance.PrefabContentsRoot.transform.TransformPoint(new Vector3(pos.x, pos.y, 0)); var oldPiovt = rt.pivot; rt.pivot = new Vector2(0.5f, 0.5f); Vector2 size = new Vector2(ElementInfo.w, ElementInfo.h); Quaternion rotation = Quaternion.identity; if (!similarityCalc) { if (rt.TryGetComponent(out var img) && img.sprite && img.sprite.texture) { var texture = img.sprite.texture; if (!string.IsNullOrEmpty(AssetDatabase.GetAssetPath(texture))) { size = new Vector2(texture.width * scale.x, texture.height * scale.y); } } rotation = Quaternion.Euler(0, 0, rotiation * -1); } // 调整大小 rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x); rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y); // 设置世界坐标 rt.position = worldPos; rt.rotation = rotation; //修正中心点 var oldRect = rt.rect; var oldLocalPosition = rt.localPosition; rt.pivot = oldPiovt; rt.localPosition = oldLocalPosition; var offsetRectPos = oldRect.position - rt.rect.position; rt.Translate(offsetRectPos); } else { var pos = ElementInfo.Position; var worldPos = StageManager.Instance.PrefabContentsRoot.transform.TransformPoint(new Vector3(pos.x, pos.y, 0)); rt.position = worldPos; } } } } #endif