using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.EventSystems; namespace Superlazy.UI { [DisallowMultipleComponent] public class SLUIEntity : SLUIObjectOnOff { public SLEntity Session => SLGame.SessionGet(BindPath); protected override bool ActiveSelf => useOnOff ? comparison.Result : (isActiveAndEnabled && inList == false || (SLGame.SessionGet(BindPath))); public bool useOnOff; public SLValueComparison comparison; public string onCommand; public string offCommand; private SLUIComponent[] uicomponents; private UIBehaviour[] behaviors; private Renderer[] renderers; private Animator animator; private SLUIOnOffTransition[] uiOnOffComponents; private List childs; private bool oldResult; private bool inList; protected override void Validate() { uicomponents = GetComponents().Where(c => c != this).ToArray(); behaviors = GetComponents(); renderers = GetComponents(); animator = GetComponent(); } protected override void Init() { uiOnOffComponents = GetComponentsInChildren().Where(t => t.GetComponentInParent() == this).ToArray(); foreach (var onOffCompo in uiOnOffComponents) { onOffCompo.InitState(this); } childs = new List(); for (var i = 0; i < transform.childCount; ++i) { childs.Add(transform.GetChild(i).gameObject); } if (useOnOff) { oldResult = false; foreach (var ui in behaviors) { ui.enabled = false; } if (animator != null) animator.enabled = false; foreach (var render in renderers) { render.enabled = false; } foreach (var compo in uicomponents) { compo.enabled = false; } foreach (var child in childs) { child.SetActive(false); } } } protected override void Enable() { if (useOnOff == false) { if (uiOnOffComponents.Length > 0) { foreach (var onOffCompo in uiOnOffComponents) { onOffCompo.StartChange(true, this, UpdateEnabled); } } return; } comparison.OnEnable(BindPath, OnChange); } protected override void Disable() { if (useOnOff == false) { if (inList) { //foreach (var onOffCompo in uiOnOffComponents) //{ // onOffCompo.InitState(false, this, onEnd); //} inList = false; // 리스트가 수명을 관리할 때에만 사용 } return; } comparison.OnDisable(); UpdateEnabled(false); } private void UpdateEnabled(bool result) { if (useOnOff == false) return; if (oldResult != result) { if (result) { if (string.IsNullOrEmpty(onCommand) == false) { SLGame.Command(onCommand, Session); } } else { if (string.IsNullOrEmpty(offCommand) == false) { SLGame.Command(offCommand, Session); } } } oldResult = result; foreach (var ui in behaviors) { ui.enabled = result; } if (animator != null) animator.enabled = result; foreach (var render in renderers) { render.enabled = result; } foreach (var compo in uicomponents) { compo.enabled = result; } foreach (var child in childs) { child.SetActive(result); } //연출로 인한 딜레이 후에 상태를 변화 시켰는데, //딜레이 동안 값이 변경되어서 연이어 또 변경이 필요할 때를 위함. if (uiOnOffComponents.Length > 0 && comparison.Result != oldResult) { OnChange(); } } private void OnChange() { if (bindParent != null && bindParent.Active == false) return; var result = true; result = comparison.Result; if (oldResult == result) return; if (uiOnOffComponents.Length > 0) { foreach (var onOffCompo in uiOnOffComponents) { onOffCompo.StartChange(result, this, UpdateEnabled); } } else { UpdateEnabled(result); } } public void SetupByParent(string key) { inherit = true; useOnOff = false; bind = key; inList = true; name = key; } public bool OnRemoveByParent(Action onEnd) { if (useOnOff) return false; if (uiOnOffComponents.Length > 0) { foreach (var onOffCompo in uiOnOffComponents) { onOffCompo.StartChange(false, this, onEnd); } return true; } return false; } } }