新手或者小规模的游戏喜欢使用SetActive或者Instantiate prefab来切换界面,这样可以,但是不灵活,也不规范,碰到大量代码的时候就会力不从心。
所谓界面与代码分离也就是将界面用代码封装起来,再通过一个管理器来控制,方便其他程序的调用和控制
介绍一下大体设计方法,让大家有一个宏观的观念
界面一共分为两种
1.Panel 面板
比如登陆面板,注册面板,进入游戏的主菜单面板,画面设置面板等等,即拥有一定相关功能的界面模块
2.Tip 提示
比如错误提示,胜利提示,失败提示,好友消息等等,即主要功能只是反馈数据信息的小界面
所有界面类都将继承PanelBase基类,通过修改每个子类的Layer枚举类型字段来设置是Panel还是Tip(PanelBase可能有歧义,但是他是所有UI的Base)
所有的UI类都继承MonoBehaviour,脚本统一挂到Canvas画布上,用PanelMgr管理类通过一个字典<string,PanelBase>来控制,界面的UI也就是具体的GameObject则是脚本内的一个GameObject字段,具体的其他按钮什么的通过该字段的Transform缓存后在实例时查找赋值
这两种Panel和Tip界面分别属于Canvas/Panel和Canvas/Tip两个GameObject的子物体,用PanelMgr管理类通过一个字典<PanelLayer,Transform>来控制
生命周期可以用子类的重写
好,下面上代码,让我们看一下详细的设计方法
public enum PanelLayer
{
Panel, //面板
Tip, //提示
}
UI基类
public class PanelBase : MonoBehaviour {
//皮肤路径
public string skinPath;
//皮肤
public GameObject skin;
//层级
public PanelLayer layer;
//面板参数
public object[] args;
#region 生命周期
public virtual void Init(params object[] args) //自定义参数
{
this.args = args;
}
//开始面板前
public virtual void OnShowing() { }
//显示面板后
public virtual void OnShowed() { }
//帧更新
public virtual void Update() { }
//关闭前
public virtual void OnClosing() { }
//关闭后
public virtual void OnClosed() { }
#endregion
#region 操作
protected virtual void Close()
{
string name = this.GetType().ToString(); //反射
PanelMgr.Instance.ClosePanel(name);
}
#endregion
}
关于子类如何重写来使用,这里先留一个悬念,最后我们在举一个例子看看怎么用
管理类