UI框架,简易版

首先定义一个UIBase类,在UIBase中定义一些虚方法:例如用户刚进入界面时候调用的方法,切换当前界面的方法,从当前返回到上一个界面的方法,界面销毁时调用的方法.

//用户第一次进入屏幕时调用
   public virtual void UserInterfaceEnter()
    {
    }
    //用户在当前屏幕切换的时候调用
    public virtual void UserInterfacePause()
    {
    }
    //用户重新回到屏幕中
    public virtual void UserInterfaceResume()
    {
    }
   // 用户界面销毁的时候
    public virtual void UserInterfaceExit()
    {
    }

创建一个UIManager是UI管理类,因为是管理类所以最好写成"单例",方便调用.

将之前做好的UI界面设置成预设体保存起来,脚本中用字典保存这些预设体Gameobject.

界面出现的先后顺序用"栈"来保存,先进后出.

在定义一个字典,用来保存加载过的所有界面的脚本

Dictionary currentUIDict = new Dictionary();

方法

定义一个方法,该方法的作用是根据名字加载预设体,并且保存到字典当中,

首先判断该预设体是否存在,存在直接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();
        //加载一个界面之后将界面的脚本保存下来
        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()

你可能感兴趣的:(UI框架,简易版)