在Unity中使用代码类来管理多个Panel(面板)之间的切换
2016-06-06 17:28
2606 查看
(想要实现的功能是:在一个主Canvas下有多个面板,通过点击某一个面板下的按钮切换到另外一个面板,再通过点击这个面板下的按钮切换到上一个面板,或者其他的面板,也就是在多个面板间进行自由的切换,简单的来说就是对UI进行管理,实现各个UI 间的自由切和交互)
首先,写一个PanelInstance.cs类,为每个要管理的panel添加这个脚本,PanelInstance.cs的代码示例如下:(PanelInstance.cs)//面板类
using UnityEngine;
using System.Collections;
public class PanelInstance : MonoBehaviour
{
public PanelInstance PanelBefore;
}
然后写一个管理Panel的类,这里称作PanelManager,PanelManager.cs的代码如下所示:(PanelManager.cs)//面板管理类
using UnityEngine;
using System.Collections;
using System;
public class PanelManager : MonoBehaviour {
public PanelInstance[] Pages;
public PanelInstance currentPanel;
void Start()
{
for(int i = 0; i < Pages.Length; i++)
{
Pages[i].gameObject.AddComponent<PanelInstance>();
}
}
void Awake()
{
if (Pages.Length <= 0)
{
return;
}
OpenPanel(Pages[0]);
}
//打开面板
public void OpenPanel(PanelInstance page)
{
if (page == null)
{
return;
}
page.PanelBefore = currentPanel;
currentPanel = page;
CloseAllPanels();
Animator anim = page.GetComponent<Animator>();
if (anim && anim.isActiveAndEnabled)
{
anim.SetBool("Open", true);
}
page.gameObject.SetActive(true);
Debug.Log("面板"+page.gameObject.name+"已经打开");
}
//通过名字打开面板
public void OpenPanelByName(string name)
{
PanelInstance page = null;
for (int i = 0; i < Pages.Length; i++)
{
if (Pages[i].name == name)
{
page = Pages[i];
break;
}
}
if (page == null)
{
return;
}
page.PanelBefore = currentPanel;
currentPanel = page;
CloseAllPanels();
Animator anim = page.GetComponent<Animator>();
if (anim && anim.isActiveAndEnabled)
{
anim.SetBool("Open", true);
}
page.gameObject.SetActive(true);
}
//关闭所有面板
public void CloseAllPanels()
{
if (Pages.Length <= 0)
{
return;
}
for(int i = 0; i < Pages.Length; i++)
{
Animator anim = Pages[i].gameObject.GetComponent<Animator>();
if (anim && anim.isActiveAndEnabled)
{
anim.SetBool("Open", false);
}
if (Pages[i].isActiveAndEnabled)
{
StartCoroutine(DisablePanelDeleyed(Pages[i]));
}
}
}
//禁用面板
public IEnumerator DisablePanelDeleyed(PanelInstance page)
{
bool closedStateReached = false;
bool wantToClose = true;
Animator anim = page.gameObject.GetComponent<Animator>();
if (anim && anim.enabled)
{
while (!closedStateReached && wantToClose)
{
if (anim.isActiveAndEnabled && !anim.IsInTransition(0))
{
closedStateReached = anim.GetCurrentAnimatorStateInfo(0).IsName("Closing");
}
yield return new WaitForEndOfFrame();
}
if (wantToClose)
{
anim.gameObject.SetActive(false);
}
}
else
{
page.gameObject.SetActive(false);
}
}
}
最后在主Canvas画布上添加一个MainMenuManager,这里称之为MainMenuManager.sc,代码如下:
(MainMenuManager.cs)//主画布管理类
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
//注意此处,MainMenuManager是继承自PanelManager的
public class MainMenuManager:PanelManager {
public string SceneStart = "zombieland";
public Text CharacterName;
public GameObject Preloader;
void Start()
{
}
public void ExitGame()
{
Application.Quit();
}
public void OpenPreviousPanel()
{
if (currentPanel && currentPanel.PanelBefore)
{
CloseAllPanels();
Animator anim = currentPanel.PanelBefore.GetComponent<Animator>();
if (anim && anim.isActiveAndEnabled)
{
anim.SetBool("Open", true);
}
currentPanel.PanelBefore.gameObject.SetActive(true);
currentPanel = currentPanel.PanelBefore;
}
}
}
然后在Unity中的Canvas的MainMenuManager.cs中把想要参与管理和切换的面板添加到数组Pages中,再为每个按钮添加相应的点击函数事件(包括点击这个按钮跳转到另外一个Panel,并执行某个功能),这样,就可以实现通过点击按钮切换到想要显示的面板,并执行相应的功能
这个类对于只需在少于5个面板直接的切换来说有点太过于复杂了,对于管理10个以上的面板切换是非常有用的,只需要根据面板的名字来进行切换就行了
(注:本文内容并非完全原创,感谢Unitz的资源包,在学习的过程中,对这个东西感觉很受用,所以,把他写下来分享给大家,希望大家一起学习)
首先,写一个PanelInstance.cs类,为每个要管理的panel添加这个脚本,PanelInstance.cs的代码示例如下:(PanelInstance.cs)//面板类
using UnityEngine;
using System.Collections;
public class PanelInstance : MonoBehaviour
{
public PanelInstance PanelBefore;
}
然后写一个管理Panel的类,这里称作PanelManager,PanelManager.cs的代码如下所示:(PanelManager.cs)//面板管理类
using UnityEngine;
using System.Collections;
using System;
public class PanelManager : MonoBehaviour {
public PanelInstance[] Pages;
public PanelInstance currentPanel;
void Start()
{
for(int i = 0; i < Pages.Length; i++)
{
Pages[i].gameObject.AddComponent<PanelInstance>();
}
}
void Awake()
{
if (Pages.Length <= 0)
{
return;
}
OpenPanel(Pages[0]);
}
//打开面板
public void OpenPanel(PanelInstance page)
{
if (page == null)
{
return;
}
page.PanelBefore = currentPanel;
currentPanel = page;
CloseAllPanels();
Animator anim = page.GetComponent<Animator>();
if (anim && anim.isActiveAndEnabled)
{
anim.SetBool("Open", true);
}
page.gameObject.SetActive(true);
Debug.Log("面板"+page.gameObject.name+"已经打开");
}
//通过名字打开面板
public void OpenPanelByName(string name)
{
PanelInstance page = null;
for (int i = 0; i < Pages.Length; i++)
{
if (Pages[i].name == name)
{
page = Pages[i];
break;
}
}
if (page == null)
{
return;
}
page.PanelBefore = currentPanel;
currentPanel = page;
CloseAllPanels();
Animator anim = page.GetComponent<Animator>();
if (anim && anim.isActiveAndEnabled)
{
anim.SetBool("Open", true);
}
page.gameObject.SetActive(true);
}
//关闭所有面板
public void CloseAllPanels()
{
if (Pages.Length <= 0)
{
return;
}
for(int i = 0; i < Pages.Length; i++)
{
Animator anim = Pages[i].gameObject.GetComponent<Animator>();
if (anim && anim.isActiveAndEnabled)
{
anim.SetBool("Open", false);
}
if (Pages[i].isActiveAndEnabled)
{
StartCoroutine(DisablePanelDeleyed(Pages[i]));
}
}
}
//禁用面板
public IEnumerator DisablePanelDeleyed(PanelInstance page)
{
bool closedStateReached = false;
bool wantToClose = true;
Animator anim = page.gameObject.GetComponent<Animator>();
if (anim && anim.enabled)
{
while (!closedStateReached && wantToClose)
{
if (anim.isActiveAndEnabled && !anim.IsInTransition(0))
{
closedStateReached = anim.GetCurrentAnimatorStateInfo(0).IsName("Closing");
}
yield return new WaitForEndOfFrame();
}
if (wantToClose)
{
anim.gameObject.SetActive(false);
}
}
else
{
page.gameObject.SetActive(false);
}
}
}
最后在主Canvas画布上添加一个MainMenuManager,这里称之为MainMenuManager.sc,代码如下:
(MainMenuManager.cs)//主画布管理类
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
//注意此处,MainMenuManager是继承自PanelManager的
public class MainMenuManager:PanelManager {
public string SceneStart = "zombieland";
public Text CharacterName;
public GameObject Preloader;
void Start()
{
}
public void ExitGame()
{
Application.Quit();
}
public void OpenPreviousPanel()
{
if (currentPanel && currentPanel.PanelBefore)
{
CloseAllPanels();
Animator anim = currentPanel.PanelBefore.GetComponent<Animator>();
if (anim && anim.isActiveAndEnabled)
{
anim.SetBool("Open", true);
}
currentPanel.PanelBefore.gameObject.SetActive(true);
currentPanel = currentPanel.PanelBefore;
}
}
}
然后在Unity中的Canvas的MainMenuManager.cs中把想要参与管理和切换的面板添加到数组Pages中,再为每个按钮添加相应的点击函数事件(包括点击这个按钮跳转到另外一个Panel,并执行某个功能),这样,就可以实现通过点击按钮切换到想要显示的面板,并执行相应的功能
这个类对于只需在少于5个面板直接的切换来说有点太过于复杂了,对于管理10个以上的面板切换是非常有用的,只需要根据面板的名字来进行切换就行了
(注:本文内容并非完全原创,感谢Unitz的资源包,在学习的过程中,对这个东西感觉很受用,所以,把他写下来分享给大家,希望大家一起学习)
相关文章推荐
- GUI - Web前端开发框架
- 评价ui设计作品好坏的八个标准(界面/交互设计研究)
- Shell 脚本编程陷阱
- 【DevOps】为什么我们永远疲于奔命?
- VBS脚本写的Windows硬件检测工具分享
- 网络管理之IP地址篇
- 文件的读出 编辑 管理
- 用vbscript实现隐藏任务栏图标的脚本
- 用autoit编写第一个脚本(Hello World)
- VBS调用WMI快速关闭IE的脚本
- Oracle数据库执行脚本常用命令小结
- 收集的ROS防火墙脚本
- JSP脚本漏洞面面观
- 不错的批处理脚本 第一部分
- VBS脚本加密/解密VBS脚本(简易免杀版1.1)
- 不错的批处理脚本实例代码 第二部分
- 使用脚本和批处理清除电脑中的痕迹的代码第1/2页
- 让你的脚本说话
- Lua脚本获取喜马拉雅MP3音频地址