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");
}
}