using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace TyphoonUI { /// /// 布局选择器 /// [RequireComponent(typeof(RectTransform))] public class RectTransformLayoutSelector : MonoBehaviour { /// /// 布局数据 /// [Serializable] public class LayoutData { public string Name; public Vector3 AnchoredPosition3D; public Vector2 SizeDelta; public Vector2 AnchorMin; public Vector2 AnchorMax; public Vector2 Pivot; public Vector3 LocalEulerAngles; public Vector3 LocalScale; } //属性类型 public enum PropertyType { AnchoredPosition3D = 1, SizeDelta = 2, AnchorMin = 4, AnchorMax = 8, Pivot = 16, LocalEulerAngles = 32, LocalScale = 64, } public static List PropertyTypes = new List() { PropertyType.AnchoredPosition3D, PropertyType.SizeDelta, PropertyType.AnchorMin, PropertyType.AnchorMax, PropertyType.Pivot, PropertyType.LocalEulerAngles, PropertyType.LocalScale, }; public RectTransform Root; [HideInInspector] public int CullingMask = -1; //布局集合 public List Layouts = new List(); protected virtual void Reset() { Root = transform.GetComponent(); } /// /// 设置布局 /// /// 布局名 public void SetLayout(string layoutName) { var match = Layouts.Where(e => e.Name == layoutName).FirstOrDefault(); if (match != null) { SetLayout(match); return; } throw new Exception($"找不到布局:{layoutName}"); } /// /// 设置布局 /// /// 布局索引 public void SetLayout(int index) { var layout = Layouts[index]; SetLayout(layout); } /// /// 设置布局 /// /// 布局数据 public void SetLayout(LayoutData data) { if (IsContain(PropertyType.AnchoredPosition3D)) { Root.anchoredPosition3D = data.AnchoredPosition3D; } if (IsContain(PropertyType.SizeDelta)) { Root.sizeDelta = data.SizeDelta; } if (IsContain(PropertyType.AnchorMin)) { Root.anchorMin = data.AnchorMin; } if (IsContain(PropertyType.AnchorMax)) { Root.anchorMax = data.AnchorMax; } if (IsContain(PropertyType.Pivot)) { Root.pivot = data.Pivot; } if (IsContain(PropertyType.LocalEulerAngles)) { Root.localEulerAngles = data.LocalEulerAngles; } if (IsContain(PropertyType.LocalScale)) { Root.localScale = data.LocalScale; } } //获取层级String public string GetCullMaskString() { if (CullingMask == -1) { return "Everything"; } var result = string.Empty; var match = PropertyTypes.Where(e => (((int)e) & CullingMask) > 0); var count = match.Count(); if (count == 0) { return "Nothing"; } if (count == 1) { return match.First().ToString(); } if (count == PropertyTypes.Count) { return "Everything"; } return "Mixed..."; } public void Nothing() { CullingMask = 0; } public void Everything() { CullingMask = -1; } public void SetMask(PropertyType type, bool isOn) { if (isOn) { CullingMask |= (int)type; } else { CullingMask &= (int)type ^ -1; } } public bool IsContain(PropertyType type) { return (((int)type) & CullingMask) > 0; } public void AddLayout() { if (Root == null) { throw new Exception("缺少 Root"); } var data = new LayoutData() { Name = "UnKnown", AnchoredPosition3D = Root.anchoredPosition3D, SizeDelta = Root.sizeDelta, AnchorMin = Root.anchorMin, AnchorMax = Root.anchorMax, Pivot = Root.pivot, LocalEulerAngles = Root.localEulerAngles, LocalScale = Root.localScale, }; Layouts.Add(data); } public void UpdateLayout(int index) { if (index < Layouts.Count) { var layout = Layouts[index]; layout.AnchoredPosition3D = Root.anchoredPosition3D; layout.SizeDelta = Root.sizeDelta; layout.AnchorMin = Root.anchorMin; layout.AnchorMax = Root.anchorMax; layout.Pivot = Root.pivot; layout.LocalEulerAngles = Root.localEulerAngles; layout.LocalScale = Root.localScale; } } public void RemoveLayout(int index) { Layouts.RemoveAt(index); } } }