菜单界面
我们设计一个简单的菜单界面,它由一个背景和几个按钮组成

将MenuPane拉取进GameData——Prefabs——UGUI——Panel文件夹内,并右键——创建UI离线数据
我们在Scripts——UGUI——Panel文件夹下新建脚本MenuPanel
1 2 3 4 5 6 7 8
| using UnityEngine; using UnityEngine.UI;
public class MenuPanel : MonoBehaviour { public Button m_StartButton, m_LoadButton, m_ExitButton; }
|
Panel只储存当前UI需要的各种组件
我们在Scripts——UGUI——Window文件夹下新建脚本MenuWnd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| using UnityEngine;
public class MenuWnd : WindowBase { private MenuPanel m_MenuPanel; public override void OnAwake(params object[] args) { m_MenuPanel = GameObject.GetComponent<MenuPanel>(); AddButtonClickListener(m_MenuPanel.m_StartButton, OnClickStart); AddButtonClickListener(m_MenuPanel.m_LoadButton, OnClickLoad); AddButtonClickListener(m_MenuPanel.m_ExitButton, OnClickExit); } void OnClickStart() { Debug.Log("开始游戏"); } void OnClickLoad() { Debug.Log("继续游戏"); } void OnClickExit() { Debug.Log("退出游戏"); } }
|
MenuWnd
负责当前菜单的所有逻辑
如何启用UI
我们修改GameStart,将其挂载的东西整理如下:

修改GameStart
脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| using UnityEngine; using UnityEngine.EventSystems;
public class GameStart : MonoBehaviour { private GameObject m_GameObject; public Transform recyclePoolTrans, sceneTrans; public RectTransform uiRoot, windowRoot; public Camera uiCamera; public EventSystem eventSystem; private void Awake() { DontDestroyOnLoad(gameObject); AssetBundleManager.Instance.LoadAssetBundleConfig(); ResourceManager.Instance.Init(this); ObjectPoolManager.Instance.Init(recyclePoolTrans,sceneTrans); } private void Start() { UIManager.Instance.Init(uiRoot, windowRoot,uiCamera,eventSystem); RegisterUI(); UIManager.Instance.CreateWindow("MenuPanel.prefab"); } void RegisterUI() { UIManager.Instance.Register<MenuWnd>("MenuPanel.prefab"); } private void Update() { UIManager.Instance.OnUpdate(); } private void OnApplicationQuit() { ResourceManager.Instance.ClearCache(); Resources.UnloadUnusedAssets(); } }
|
在挂载脚本时,将需要的引用一一挂载即可。
UI的启用
首先调用UIManager.Instance.Init
方法,获取uiRoot, windowRoot,uiCamera,eventSystem
再调用UIManager.Instance.Register
方法,将面板类注册进去。
调用UIManager.Instance.Register
方法,是为了热更新考虑,窗口方法先注册进去,只用调用了CreateWindow
才产生实例。
再调用UIManager.Instance.CreateWindow
,将继承了WindowBase
的窗口逻辑类真正的实例化出来。
UI的启用直接调用了ObjectPoolManager,生成的UI
1
| GameObject wndObj = ObjectPoolManager.Instance.InstantiateObject(UIPREFABPATH + wndName,false,false);
|
我们生成的wndObj就是UI窗口的Prefab,它创建出来的bClear参数是false,表示它在切换场景时不会被销毁。
如果我们想关闭窗口,直接调用UIManager.Instance.CloseWindow
,如果直接调用,此窗口会在对象池中缓存,等待再次调用CreateWindow时拿出来,如果我们添加destroy:true
参数,那么这个窗口就在内存中完全销毁。
UIManager还提供了EnableWnd
和DisableWnd
,直接的显示和隐藏对象。