菜单界面

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

菜单界面

将MenuPane拉取进GameData——Prefabs——UGUI——Panel文件夹内,并右键——创建UI离线数据

MenuPanel

我们在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需要的各种组件

MenuWnd

我们在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

修改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还提供了EnableWndDisableWnd,直接的显示和隐藏对象。