using TyphoonEvent; using UnityEngine; namespace TyphoonUI { /// /// UI组件 /// public abstract class UIComponent : MonoBehaviour, IScrollCell, IEventOperation { public UIObject ViewObject { get; private set; } /// /// 附加视图 /// /// internal virtual void Attach(UIObject view) { ViewObject = view; InitializeEventOperation(); OnInitialize(); } /// /// 初始化 /// protected abstract void OnInitialize(); /// /// 滚动视窗-更新数据 /// /// 数据索引 /// 数据项 public virtual void UpdateContent(int index, object data) { } /// /// 滚动视窗-元素是否显示 /// public virtual bool IsVisible => gameObject.activeSelf; /// /// 滚动视窗-激活/关闭元素 /// public virtual void SetVisible(bool visible) { gameObject.SetActive(visible); } /// /// 滚动视窗- 元素节点 /// public virtual Transform Root => transform; /// /// 滚动视窗- 构建时初始化 /// public virtual void OnCellInitialize() { } /// /// 滚动视窗- 更新坐标 /// public virtual void OnUpdatePosition(float scrollPosition, Vector3 localPosition, UIScrollView scrollView) { transform.localPosition = localPosition; } /// /// 销毁时触发 /// protected virtual void OnDestroy() { ReleaseEventOperation(); } /// /// 构建子面板 /// protected T CreateSubPanel(UIObject view) where T : UIPanel { var result = view.gameObject.AddComponent(); result.Attach(view); result.RootView.alpha = 0; result.RootView.blocksRaycasts = false; return result; } /// /// 构建子组件 /// protected T CreateSubComponent(UIObject view) where T : UIComponent { var result = view.gameObject.AddComponent(); result.Attach(view); return result; } #region 事件系统 public EventOperation EventOperation { get; set; } public virtual IEventProxy[] EventProxies { get; } = null; private void InitializeEventOperation() => EventOperation.Register(this); /// /// 激活单个事件代理 /// /// 消息类型 protected void EnableEvent() => EventOperation.Enable(); /// /// 关闭单个事件代理 /// /// 消息类型 protected void DisableEvent() => EventOperation.Disable(); /// /// 开启所有事件代理 /// protected void EnableAllEvent() => EventOperation.EnableAll(); /// /// 关闭所有事件代理 /// protected void DisableAllEvent() => EventOperation.DisableAll(); /// /// 释放事件 /// protected void ReleaseEventOperation() => EventOperation.Release(); #endregion } }