Unity精简的UI框架

UIManager.cs UI管理类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Valve.VR;

/// <summary>
/// UI管理器(单例)用于管理界面的打开、隐藏、删除等操作
/// </summary>
public class UIManager : MonoBehaviour
{
    private static UIManager instance;
    private Stack<UIBase> uiStack;//加载的UI栈集
    private Dictionary<string, UIBase> uiDict;//存放已加载过的UI(名称和脚本)
    private Transform uisRoot,leftHandUIRoot,deskUIRoot;//三处ui根节点
    public static UIManager Instance {
        get { return GetInstance(); }
    }
    /// <summary>
    /// 实例化UIManager
    /// </summary>
    /// <returns></returns>
    private static UIManager GetInstance()
    {
        if (instance == null)
        {
            var uimanager = new GameObject("UIManager");
            instance = uimanager.AddComponent<UIManager>();
            DontDestroyOnLoad(uimanager);
            DontDestroyOnLoad(GameObject.Find("UIS").gameObject);//确保UI根节点不会删除
        }
        return instance;
    }

    private void Awake()
    {
        Initialize();
    }
    void Start()
    {
        
    }

    void Update()
    {
        
    }

    /// <summary>
    /// 初始化操作
    /// </summary>
    private void Initialize()
    {
        uisRoot = GameObject.Find("UIS/VRCamera3DUIS").transform;//当前UI节点为相对头盔相机生成位置不变
        if (leftHandUIRoot == null)
        {
            if(Valve.VR.InteractionSystem.Player.instance)
            leftHandUIRoot = Valve.VR.InteractionSystem.Player.instance.leftHand.transform.Find("LeftHandUIS");//当前在左手手柄处依附的操作界面根节点
        }
        deskUIRoot = GameObject.Find("UIS/Canvas").transform;//所有桌面UI的根节点
    }


    /// <summary>
    /// 抓取UI,字典中有直接获取,没有再加载
    /// </summary>
    /// <param name="uiPath"></param>
    /// <returns></returns>
    private UIBase GetUI(string uiPath)
    {
        if (uiDict == null)
        {
            uiDict = new Dictionary<string, UIBase>();
        }
        UIBase ui;
        uiDict.TryGetValue(uiPath,out ui);
        if (ui == null)
        {
            uiDict.Remove(uiPath);
            GameObject instantiateUI;
            if (uiPath.Contains("2DUI"))
            {
                instantiateUI = Instantiate(Resources.Load("2DUI/" + uiPath)) as GameObject;
            }
            else
            {
                instantiateUI = Instantiate(Resources.Load("3DUI/" + uiPath)) as GameObject;
            }
            if (instantiateUI != null)
            {
                if (uiPath.Contains("LeftHandUI"))
                {
                    if (leftHandUIRoot == null)
                    {
                        if (Valve.VR.InteractionSystem.Player.instance)
                        {
                            leftHandUIRoot = Valve.VR.InteractionSystem.Player.instance.leftHand.transform.Find("LeftHandUIS");//当前在左手手柄处依附的操作界面根节点
                            instantiateUI.transform.SetParent(leftHandUIRoot, true);//手柄UI
                        }
                        else
                        {
                            Debug.LogError("vr头显未开启或无信号!!");
                        }
                    }
                    else
                    {
                        instantiateUI.transform.SetParent(leftHandUIRoot, true);//手柄UI
                    }        
                }
                else if (uiPath.Contains("2DUI"))
                {
                    instantiateUI.transform.SetParent(deskUIRoot, true);//桌面UI
                }
                else
                {
                    if (Valve.VR.InteractionSystem.Player.instance)
                    {
                        uisRoot.transform.position = Valve.VR.InteractionSystem.Player.instance.transform.Find("SteamVRObjects/VRCamera/CameraUIS").transform.position;
                        uisRoot.transform.rotation = Valve.VR.InteractionSystem.Player.instance.transform.Find("SteamVRObjects/VRCamera/CameraUIS").transform.rotation;
                    }
                    instantiateUI.transform.SetParent(uisRoot, true);//非手柄处UI
                    instantiateUI.GetComponent<RectTransform>().localPosition = Vector3.zero;
                    instantiateUI.GetComponent<RectTransform>().localRotation =Quaternion.Euler(Vector3.zero);
                }
                var targetUI = instantiateUI.GetComponent<UIBase>();
                uiDict.Add(uiPath,targetUI);
                return targetUI;
            }
        }
        return ui;
    }
    /// <summary>
    /// 显示UI
    /// </summary>
    /// <param name="uiPath"></param>
    public void PushUI(string uiPath) {
        if (uiStack == null)
        {
            uiStack = new Stack<UIBase>();
        }
        if (uiStack.Count > 0)
        {
            var topUI = uiStack.Peek();
            //topUI.Exit();//待定修改**
        }
        UIBase getUI = GetUI(uiPath);
        getUI.Enter();
        getUI.Showing();
        uiStack.Push(getUI);
    }
    /// <summary>
    /// 关闭UI显示新UI
    /// </summary>
    /// <param name="uiPath"></param>
    /// <param name="isPopCurrentUI"></param>
    public void PushUI(string uiPath, bool isPopCurrentUI)
    {
        if (isPopCurrentUI)
        {
            PopCurrentUI();
        }
        else
        {
            PopAllUI();
        }
        PushUI(uiPath);
    }
    /// <summary>
    /// 隐藏当前UI
    /// </summary>
    public void PopCurrentUI()
    {
        if (uiStack == null)
        {
            uiStack = new Stack<UIBase>();
        }
        if (uiStack.Count <= 0)
            return;
        UIBase topUI = uiStack.Pop();
        topUI.Exit();
    }
    /// <summary>
    /// 隐藏所有UI
    /// </summary>
    public void PopAllUI()
    {
        if (uiStack == null)
        {
            uiStack = new Stack<UIBase>();
        }
        if (uiStack.Count <= 0)
            return;
        while (uiStack.Count > 0)
        {
            UIBase topPanel = uiStack.Pop();
            topPanel.Exit();
        }
    }
}

UIBase.cs UI基类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 界面的生命周期:Awake --> Enter -->Showing-->Exit
/// </summary>
public class UIBase : MonoBehaviour
{
    /// <summary>
    /// 打开界面初始化
    /// </summary>
    protected virtual void Awake()
    {
        //if (transform.GetComponent<Canvas>().renderMode != RenderMode.WorldSpace)
        //{
        //    transform.GetComponent<RectTransform>().localPosition=Vector3.zero;
        //    transform.GetComponent<RectTransform>().sizeDelta = Vector2.zero;
        //    transform.GetComponent<RectTransform>().localScale = Vector3.one;
        //}
    }

    /// <summary>
    /// 打开界面
    /// </summary>
    public virtual void Enter()
    { 
    
    }
    /// <summary>
    /// 界面显示中
    /// </summary>
    public virtual void Showing()
    { 
    
    }
    /// <summary>
    /// 界面退出
    /// </summary>
    public virtual void Exit()
    {
        Destroy(this.gameObject);
    }
}
 

UiBase子类

HeadUIControl.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class HeadUControl : UIBase
{
    private Button goinbtn;
    public override void Enter()
    {
        base.Enter();
        goinbtn = transform.Find("Panel/Button").GetComponent<Button>();
        goinbtn.onClick.AddListener(ClickGoInBtn);
    }

    public override void Showing()
    {
        base.Showing();
    }
    public override void Exit()
    {
        base.Exit();
    }

    public void ClickGoInBtn()
    {
        UIManager.Instance.PushUI("LoadingUI_2DUI",true);
    }
}
 

StartCom.cs 程序入口

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StartCom : MonoBehaviour
{
    void Start()
    {
        UIManager.Instance.PushUI("HeadUI_2DUI");
    }

}
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值