Files
plugin-library/Assets/UI/Scripts/UIFramework/Runtime/UIViewBase/UIView.cs

142 lines
4.0 KiB
C#
Raw Normal View History

2025-09-18 18:25:40 +08:00
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.UI;
namespace SkierFramework
{
public class UIView : MonoBehaviour, IBindableUI
{
private UIViewController _controller;
private GameObject _lastSelect;
private Canvas _canvas;
public GameObject DefaultSelect;
public UIViewController Controller => _controller;
public virtual void OnInit(UIControlData uIControlData, UIViewController controller)
{
if (uIControlData != null)
{
uIControlData.BindDataTo(this);
}
_controller = controller;
_canvas = gameObject.GetOrAddComponent<Canvas>();
gameObject.GetOrAddComponent<CanvasScaler>();
gameObject.GetOrAddComponent<GraphicRaycaster>();
}
/// <summary>
/// 事件监听
/// </summary>
public virtual void OnAddListener() { }
/// <summary>
/// 事件移除
/// </summary>
public virtual void OnRemoveListener() { }
/// <summary>
/// 打开
/// </summary>
public virtual void OnOpen(object userData)
{
SortOrder();
_canvas.overrideSorting = true;
_canvas.sortingOrder = _controller.order;
OnAddListener();
_lastSelect = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject;
}
protected virtual void SortOrder()
{
SortOrder(transform, _controller.order + 1);
}
/// <summary>
/// 递归的将所有孩子层级设置正确一些默认摆在UI上的特效等正确分配层级
/// </summary>
protected int SortOrder(Transform target, int order)
{
var canvas = target.GetComponent<Canvas>();
if (canvas != null && canvas != _canvas)
{
canvas.overrideSorting = true;
canvas.sortingOrder = order++;
canvas.gameObject.layer = Layer.UI;
}
var psr = target.GetComponent<ParticleSystemRenderer>();
if (psr != null)
{
psr.sortingOrder = order++;
psr.gameObject.layer = Layer.UI;
}
var sortGroup = target.GetComponent<SortingGroup>();
if (sortGroup != null)
{
sortGroup.sortingOrder = order++;
sortGroup.gameObject.SetLayerRecursively(Layer.UI);
}
var sr = target.GetComponent<SpriteRenderer>();
if (sr != null)
{
sr.sortingOrder = order++;
sr.gameObject.layer = Layer.UI;
}
for (int i = 0; i < target.childCount; i++)
{
order = SortOrder(target.GetChild(i), order);
}
return order;
}
/// <summary>
/// 恢复
/// </summary>
public virtual void OnResume()
{
if (DefaultSelect != null)
{
UnityEngine.EventSystems.EventSystem.current.SetSelectedGameObject(DefaultSelect);
}
}
/// <summary>
/// 被覆盖
/// </summary>
public virtual void OnPause()
{
}
/// <summary>
/// 被关闭
/// </summary>
public virtual void OnClose()
{
OnRemoveListener();
if (_lastSelect != null && _lastSelect.activeInHierarchy)
{
UnityEngine.EventSystems.EventSystem.current.SetSelectedGameObject(_lastSelect);
}
}
/// <summary>
/// 取消按钮响应
/// </summary>
public virtual void OnCancel()
{
UIManager.Instance.Close(this);
}
/// <summary>
/// 被卸载释放
/// </summary>
public virtual void OnRelease() { }
}
}