using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class UIWindowPop : MonoBehaviour
{
private static UIWindowPop _instance;
public static UIWindowPop Instance
{
get {
if (_instance==null)
{
_instance = new GameObject("UIWindowPop").AddComponent<UIWindowPop>();
}
return _instance;
}
}
private Dictionary<string, Transform> cachWindow = new Dictionary<string, Transform>();
private Stack<UIPackage> stackPackage = new Stack<UIPackage>();
private Transform popRoot;
private string PopName = "PopWindow";
private Transform root;
private Transform mask;
private void Awake()
{
InitWindow();
}
void InitWindow()
{
//画布根节点
root = GameObject.Find("UICanvas").transform;
popRoot =Instantiate<Transform>(LoadWindow<Transform>("UI/"+PopName), root);
popRoot.name = PopName;
mask = popRoot.Find("mask");
mask.gameObject.SetActive(false);
RepairRootLayer();
EventTriggerListener.GetEventListener(mask.gameObject).onClick = OnMaskClick;
}
private void OnMaskClick(GameObject go)
{
if (stackPackage.Count==0)
{
return;
}
UIPackage package= stackPackage.Pop();
Transform curWindow = popRoot.Find(package._name);
if (package.onPop!=null)
{
package.onPop(curWindow.name);
}
curWindow.gameObject.SetActive(false);
Destroy(curWindow.gameObject);
if (stackPackage.Count==0)
{
mask.gameObject.SetActive(false);
}
}
void RepairRootLayer()
{
if (!mask.gameObject.activeSelf)
{
mask.gameObject.SetActive(true);
}
popRoot.SetAsLastSibling();
mask.SetAsLastSibling();
}
/// <summary>
/// 弹窗
/// </summary>
/// <param name="windowName">窗体名称</param>
/// <param name="path">窗体相对路径 </param>
/// <param name="_onEnter">弹窗加载后返回 窗体对象</param>
/// <param name="_OnPop">关闭弹窗 事件通知</param>
public void EnterWindow(string windowName,string path="",Action<Transform> _onEnter=null,Action<object> _OnPop = null)
{
Transform cachTrans = null;
Transform trans = null;
cachWindow.TryGetValue(path+windowName, out cachTrans);
if(cachTrans == null)
{
cachTrans= LoadWindow<Transform>(path + windowName);
cachWindow[windowName] = cachTrans;
}
trans = Instantiate<Transform>(cachTrans, popRoot);
trans.name = windowName;
UIPackage package = new UIPackage(windowName, _OnPop);
stackPackage.Push(package);
RepairRootLayer();
trans.SetAsLastSibling();
if (_onEnter != null)
{
_onEnter(trans);
}
trans.gameObject.SetActive(true);
}
T LoadWindow<T>(string path) where T : UnityEngine.Object
{
T t = default(T);
try
{
t= Resources.Load<T>(path);
}
catch (System.Exception ex)
{
Debug.Log("UIWindowPop.LoadWindow path 加载失败");
}
return t;
}
private void OnDestroy()
{
_instance = null;
}
internal class UIPackage
{
public string _name;
public Action<object> onPop ;
public UIPackage(string str,Action<object> call)
{
_name = str;
onPop = call;
}
}
}
窗体弹窗层级管理
最新推荐文章于 2023-09-11 23:31:49 发布