首先定义一个UIBase类,在UIBase中定义一些虚方法:例如用户刚进入界面时候调用的方法,切换当前界面的方法,从当前返回到上一个界面的方法,界面销毁时调用的方法.
//用户第一次进入屏幕时调用
public virtual void UserInterfaceEnter()
{
}
//用户在当前屏幕切换的时候调用
public virtual void UserInterfacePause()
{
}
//用户重新回到屏幕中
public virtual void UserInterfaceResume()
{
}
// 用户界面销毁的时候
public virtual void UserInterfaceExit()
{
}
创建一个UIManager是UI管理类,因为是管理类所以最好写成"单例",方便调用.
将之前做好的UI界面设置成预设体保存起来,脚本中用字典保存这些预设体Gameobject.
界面出现的先后顺序用"栈"来保存,先进后出.
在定义一个字典,用来保存加载过的所有界面的脚本
Dictionary<string, UIBase> currentUIDict = new Dictionary<string, UIBase>();
方法
定义一个方法,该方法的作用是根据名字加载预设体,并且保存到字典当中,
首先判断该预设体是否存在,存在直接return出去;不存在,就构建一条路径然后加载该预设体并保存到字典当中.
if (UIObjDict.ContainsKey(UINmae))
{
return;
}
//构建一条路径
string path = "prefab" + "/" + UINmae;
//加载数据
GameObject uiObj = Resources.Load(path) as GameObject;
if (uiObj != null)
{
UIObjDict.Add(UINmae, uiObj);
}
定义方法,实现保存游戏对象挂载的UIBase类型的脚本,通过脚本操控游戏对象
首先还是判断该脚本是否已加载过,挂载过return该脚本;
没有挂载过,就需要取出预设体,然后实例化,获取脚本,然后保存到该字典当中
//通过预设体实例化游戏对象:保存的是游戏对象身上UIBase类型的脚本,通过游戏脚本操作游戏对象
public UIBase InstatiteUIBaseByName(string UIName)
{
//判断当前要加载的这个东西之前有没有加载过(是否保存在currentUIDict里面)
if(currentUIDict.ContainsKey(UIName))
{
return currentUIDict[UIName];
}
//如果不存在则实例化
//取出预设体
GameObject objPrefab = UIObjDict[UIName];
//根据预设体进行实例化,即生成预设体
GameObject obj =GameObject.Instantiate(objPrefab);
UIBase uibase = obj.GetComponent<UIBase>();
//加载一个界面之后将界面的脚本保存下来
currentUIDict.Add(UIName, uibase);
obj.name = UIName;
return uibase;
}
接下来是让界面显示和消失
//界面入栈(让界面显示出来)
public void PushUserInterface(string UIName)
{
if (UIStack.Count > 0)
{
//栈顶的界面要停止,隐藏下去
UIBase oldUI = UIStack.Peek();
oldUI.UserInterfacePause();
}
//通过名字获取新的界面
UIBase newUI = InstatiteUIBaseByName(UIName);
//新的界面压入栈中
UIStack.Push(newUI);
//调用新的界面
newUI.UserInterfaceEnter();
}
//界面出栈(让界面消失)
public void PopUserInterface()
{
//栈顶的界面调出其退出的方法
UIBase oldUI = UIStack.Pop();
oldUI.UserInterfaceExit();
//如果栈中还有其他界面,要让他重新显示出来
if (UIStack.Count > 0)
{
UIBase newUI = UIStack.Peek();
newUI.UserInterfaceResume();
}
}
最后要在需要切换UI界面挂载上脚本,且该脚本要重写UIBase里的方法
界面都是预设体,界面加载在通过第一个方法写在Awake()