如何实现一个框架去实现多个UI界面之间的切换!最新最快的方法!

从老版本界面onGUI--->到GUI插件NGUI-->再到新版本界面UGUI.随着版本的更新,UI界面的设置也各不相同,现在公司比较常用的也就是UGUI了,那么我们要怎么去快速的使用UGUI去实现功能呢?UGUI系统是从Unity4.6开始被集成到Unity编译器中的。Unity官方给这个新的UI系统赋予的标签是:灵活,快速和可视化。对于开发者而言,就是有三个优点:效率高效果好,易于使用和扩展以及与Unity的兼容性高。新的UGUI系统具有以下特点:

1. 引擎内置,结合更加紧密

2. 运行稳定,操作方便

UGUI与老版本onGUI相比:

1. 独立的坐标体系

2. 全新的事件机制

3. 更佳高效率的运转效率

一.在我们接触UGUI的时候,首先肯定会先接触一些UGUI的一些组件,因为只有我们先了解了这些组件,我们才知道如何去应用它,如何去用脚本编辑它

从这里我们可以看到UI有这些个插件.具体怎么去使用呢!大家还是要亲手体会下才能更加的深入体会它的用处!好的,这里我们主要讲的是框架!

二.UI框架

1.我们写框架时,要确保它能够在这个游戏里,能够在多个不同的地方出现,像一般的方法是不行的,这时候我们就会采用单例来实现这个功能.首先我们先写一个单例

 

public class UIManager : MonoBehaviour {
static UIManager instance;
public static UIManager Instance
{
get
{
return instance;
}
}

 

private void Awake()
{
instance = this;

}//这就是一个单例了;

2.为了能够更好的存储我们的对象,我们会在这里采用字典dictionary来存放我们的界面(预设体);

Dictionary<string,GameObject>UIobjDice=new Dictionary<string,GameObject>();

string prefabDIR="prefab"//用来获取预设体文件的名

void AddUIprefabByName(string UIName)//根据名字加载预设体,并保存在字典当中
{
if (UIobjDice.ContainsKey(UIName))//判断是否存在,不存在就加载
{
return;
}
string path = prefabDIR + "/" + UIName;//构建一条路径
GameObject uiObj = Resources.Load<GameObject>(path);//加载的路径
if(uiObj != null)
{
UIobjDice.Add(UIName, uiObj);//添加
}

}

3.用我们的字典存储好了预设体后,我们还要给预设体添加脚本,而第一个脚本呢,就做为我们所有预设体的父类,父类还是继承于MonoBehaviour的,之后我们再创建一个就做为预设体的脚本了,这个脚本就继承于我们的UIBase了,在父类这个脚本当中我们会添加四个方法,这四个方法必须是该预设体全都得使用的,也就是用虚方法来表示.从四个方法中我们可以看到用户进入屏幕当中,用户界面停止,用户界面回到屏幕当中,和用户界面销毁的时候.这四个方法.

----------------------------------------------------------------------------

父类脚本

public class UIBase : MonoBehaviour {//

public virtual void UserInterfaceEnter()//用户界面第一次进入屏幕当中的时候调用
{

}
public virtual void UserInterfacePause()//用户界面在当前屏幕停止(被切换)的时候调用
{

}
public virtual void UserInterfaceResume()//用户界面重新回到屏幕当中
{

}
public virtual void UserInterfaceExit()//用户界面销毁的时候
{

}

---------------------------------------------------------------------------------

预设体脚本

public class UIoptionScript : UIBase {                                  //在这里我们是继承UIBase的 

public override void UserInterfaceEnter()//用户界面第一次进入屏幕当中的时候调用
{
GetComponent<Canvas>().worldCamera = Camera.main; //获取摄像机
gameObject.SetActive(true);
}

public override void UserInterfaceExit()//用户界面销毁的时候
{
gameObject.SetActive(false);
}

public override void UserInterfacePause()//用户界面在当前屏幕停止(被切换)的时候调用
{
gameObject.SetActive(false);
}

public override void UserInterfaceResume()//用户界面重新回到屏幕当中
{
gameObject.SetActive(true);
}

 

4.我们的存储了我们的对象之后我们还要去加载我们对对象脚本,我们在这里还是采用字典Dictionary去存放,

Dictionary<string, UIBase> currentUIdict = new Dictionary<string, UIBase>();

//通过预设体实例化游戏对象:保存的是游戏对象身上UIBASE类型的脚本,通过这个脚本就可以操作游戏对象
public UIBase INstantiteUIBYName(string UIname)
{
//判断当前加载的这个东西之前有没有加载过(是否保存在 currentUIdict里面)
if ( currentUIdict.ContainsKey (UIname))
{
return currentUIdict[UIname];
}

//如果不存在则实例化(true)
GameObject objPerfab = UIobjDice[UIname];//取出预设体
GameObject obj= GameObject.Instantiate(objPerfab);//根据预设体进行实例化

UIBase uibase = obj.GetComponent<UIBase>();//预设体获取脚本
currentUIdict.Add(UIname, uibase);//加载一个界面之后将界面的脚本保存下来
obj.name = UIname;//获取脚本的名字
return uibase;
}

5.我们玩游戏时,是不是经常一个界面界面的切换,为了能够更好的控制界面的先后关系,在这里我们设置一个栈用来保存轮机屏幕的先后关系;

* peek:将对象插入stack顶部(入栈操作)
* pop:移除并返回stack顶部(出栈操作)

Stack<UIBase> UIstack = new Stack<UIBase>();//栈

//界面入栈(让界面显示出来)
public void pushUserInterface(string UIname)
{
if(UIstack .Count > 0)//如果这个栈的数量大于0
{
UIBase oldUI = UIstack.Peek();//栈顶的界面要停止了,隐藏下去
oldUI.UserInterfacePause();//获取用户界面在当前屏幕停止(被切换)的时候调用的方法
}
UIBase newUI = INstantiteUIBYName(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();//用户重新回到屏幕当中
}
}

6.我们有了游戏界面后,我们还得有游戏的声音,在这里我们设置下,和上面的框架有点相同

public class AudioManage : MonoBehaviour {
public static AudioManage instance;//单例
public static AudioManage Instance
{
get
{
return instance;
}
}
string audioDir = "Audios";
Dictionary<string, AudioClip> AllcBGNDict = new Dictionary<string, AudioClip>();
AudioSource audioSource;//当前播放的音频
void Awake()
{
instance = this;
audioSource = GetComponent<AudioSource>();//获取音频播放器组件
//设置
audioSource.playOnAwake= true;//开始时播放
audioSource.loop = true;//播放循环

}

public void playBGM(string ACName)//播放一个背景音乐
{
AudioClip ac;
if (AllcBGNDict.ContainsKey(ACName))//判断这首音乐是否已经加载到内存当中,是的话就获取出来
{
ac = AllcBGNDict[ACName];
}
else//不是的话就从资源文件夹当中加载
{
//构建路径
string pate = audioDir + "/" + ACName;
ac= Resources.Load<AudioClip>(pate);
AllcBGNDict.Add(ACName, ac);
}
audioSource.clip = ac;
audioSource.Play();
}

public void StopBgM()//停止播放背景音乐
{
audioSource.Stop ();
}
public void ResumeBGM()//开始播放背景音乐
{
audioSource.Play();
}

6.在游戏开始时我们要设置她先显现哪个画面或者是音乐,然后通过这个画面的按键又去实现什么功能,

UIManager.Instance.pushUserInterface("UIstart");//加载的预设体名
AudioManage.instance.playBGM("c");//加载的音乐歌名

7.在这一步主要是教我们怎么去实现通过按键,当你按下的时候跳出别一个画面上去,这里我们通过按键的监听事件,,去加载我们预设体中的方法

 框架的大概意思就是这样了,它是通过脚本中的方法去完成界面控件的每一个功能,而不是直接在我们的Unity中设置

posted @ 2017-09-30 10:22  青葱记忆染指悲凉  阅读(3078)  评论(0编辑  收藏  举报