using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace Cryville.Common.Unity.UI { public class AspectRatioLayoutElement : UIBehaviour, ILayoutElement { [SerializeField] private float m_aspectRatio = 1; public float AspectRatio { get { return m_aspectRatio; } set { SetProperty(ref m_aspectRatio, value); } } [SerializeField] private bool m_isVertical = false; public bool IsVertical { get { return m_isVertical; } set { SetProperty(ref m_isVertical, value); } } private void SetProperty(ref T prop, T value) { if (Equals(prop, value)) return; prop = value; SetDirty(); } private void SetDirty() { if (!IsActive()) return; LayoutRebuilder.MarkLayoutForRebuild(transform as RectTransform); } public float minWidth { get { return m_isVertical ? 0 : (transform as RectTransform).rect.height * m_aspectRatio; } } public float preferredWidth { get { return minWidth; } } public float flexibleWidth { get { return 0; } } public float minHeight { get { return m_isVertical ? (transform as RectTransform).rect.width / m_aspectRatio : 0; } } public float preferredHeight { get { return minHeight; } } public float flexibleHeight { get { return 0; } } public int layoutPriority { get { return 1; } } public void CalculateLayoutInputHorizontal() { } public void CalculateLayoutInputVertical() { } protected override void OnDidApplyAnimationProperties() { base.OnDidApplyAnimationProperties(); SetDirty(); } protected override void OnDisable() { SetDirty(); base.OnDisable(); } protected override void OnEnable() { base.OnEnable(); SetDirty(); } protected override void OnRectTransformDimensionsChange() { base.OnRectTransformDimensionsChange(); SetDirty(); } protected override void OnTransformParentChanged() { base.OnTransformParentChanged(); SetDirty(); } protected override void OnValidate() { SetDirty(); } } }