背包系统搭建,实现效果如下:
1. UI系统的搭建
- 首先创立一个UIroot空物体
其子物体是UI相关的游戏物体
创建一个UICanvas作为所有窗口的根节点,所有生成的UI窗口的canvas都在其下做统一管理。
2. 设定好UICanvas的由一个专门渲染UI的camera渲染,同时设定好自适应的尺寸。
- 采用单例模式,用一个UIManager类来管理。
•1.在UImanager定义一个枚举类,规定可能存在的窗口。
•2.用一个字典类保存每一个打开过的窗口。键就是枚举类的值,值是动态加载生成的窗口克隆。
•3.实现一个打开窗口的方法:通过之前定义的枚举来作为参数打开相应的窗口。如果之前没打开过,就通过动态加载来生成一个,如果之前打开过,就根据枚举的值在从之前保存的字典里调出来将其激活。
•4.同样实现一个关闭窗口的方法:就是通过枚举变量,在字典中找出相应的窗口将其隐藏。
具体UImanager类实现代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIManager //UI管理类
{
private static UIManager _instance;
private UIManager() {
}//私有化构造函数
public static UIManager Instance
{
get
{
if (_instance == null)
{
_instance = new UIManager();
}
return _instance;
}
}
public enum UIType//规定可能存在的窗口
{
MainMenu, CharacterView, LoginView, SettingView, PopView };
Dictionary<UIType, GameObject> allView = new Dictionary<UIType, GameObject>();//通过字典保存每个窗口
int _maxSortNum = 0;
public GameObject OpenView(UIType uiType)//通过UIType1打开窗口
{
string path = "";
switch (uiType)
{
case UIType.CharacterView:
path = "View/CharacterCanvas";
break;
case UIType.PopView:
path = "View/PopUIView";
break;
}
if (allView.ContainsKey(uiType))//如果UI已存在
{
allView[uiType].SetActive(true);
allView[uiType].GetComponent<Canvas>().sortingOrder = ++_maxSortNum;
return allView[uiType];
}
else
{
GameObject UIPrefab = Resources.Load<GameObject>(path);
GameObject UIPanel = GameObject.Instantiate(UIPrefab);
//指定父节点
UIPanel.transform.SetParent(GameObject.Find("MainUICanvas").transform);
//四角拉伸
RectTransform popRect = UIPanel.GetComponent<RectTransform>();
popRect.anchorMin = Vector2.zero;
popRect.anchorMax = Vector3.one;
popRect.sizeDelta = Vector2.zero;
//指定位置大小//要先设置锚点,后调位置
UIPanel.transform.localPosition = Vector3.zero;
UIPanel.transform.localScale = Vector3.one;
UIPanel.GetComponent<Canvas>().sortingOrder = ++_maxSortNum;
allView.Add(uiType, UIPanel);//存下ui
return UIPanel;
}
}
public void CloseView(UIType uiType)//关闭UI的方法
{
if (allView.ContainsKey(uiType)&& allView[uiType].activeSelf)//如果UI已存在且开启状态才能关
{
allView[uiType].SetActive(false);
if (allView[uiType].GetComponent<Canvas>().sortingOrder == _maxSortNum)
{
allView[uiType].GetComponent<Canvas>().sortingOrder = --_maxSortNum;
}
}
}
}
5.之后就可以做一个个UI窗口的预制体,在枚举体里加上对应的