您当前的位置:主页 > 传世教程 >

Unity3D中的UI编程

发布时间:2019-05-25 19:24

我参与的第一个商业项目是第一人称益智游戏Fabric。在大多数情况下,我编写了一个关卡编辑器。可以想象,UI是其中非常重要的一部分。我这样做的方式很好......让我们说这不是一个很好的实现。所以对于我的下一个项目,我决定开发一个更好的系统,这就是我想出来的。

我想到的第一件事是应该有一个班来统治他们。所以我把它命名为UIManager。这是其他组件将了解的唯一与UI相关的类。它将带来请求的UI元素进行筛选并告诉他们该做什么。而且由于一次只有一个UIManager,我把它变成了单身。为了在不同的UI状态(主菜单,游戏,暂停等)之间轻松切换,我决定为每个UI状态创建一个面板。现在我的层次结构中有MainMenuPanel,InGamePanel和PausePanel。正如我上面提到的,UIManager只会告诉这些面板该做什么。了解如何做到这一点应该是他们的责任。出于这个原因,为每个面板创建一个脚本似乎是个好主意。另外,我创建了一个在切换过程中使用的枚举。

现在我有一个UIManager类,它在面板之间切换,有时会告诉他们该做什么。这是它的样子:

 使用UnityEngine;公共enum小组{主要,在游戏中,暂停,没有}公共类UIManager:Singleton< UIManager>{[SerializeField]私人MainMenuPanel mainMenuPanel;[SerializeField]私人InGamePanel inGamePanel;[SerializeField]私有PausePanel pausePanel;public void SetPanel(面板类型){mainMenuPanel.gameObject.SetActive(type == Panel.Main);inGamePanel.gameObject.SetActive(type == Panel.InGame);pausePanel.gameObject.SetActive(type == Panel.Pause);}}  

现在我可以轻松地隔离每个面板的能。如果我需要从某个面板调用特定方法,它也将通过UIManager完成。例如,让我们创建一个“FadePanel”,它将负责淡入和淡出请求。以下是该特定面板的代:

 使用System;使用System.Collections;使用UnityEngine;[RequireComponent(typeof运算(CanvasGroup))]公共课FadePanel:MonoBehaviour{private CanvasGroup cGroup;public float fadeSpeed = 5;public float middleWaitTime = 0.5f;[HideInInspector]public bool inProgress = false;无醒(){cGroup = GetComponent&lt; CanvasGroup&gt;();}public IEnumerator Fade(Action finalCallback,params Action [] callback){inProgress = true;而(cGroup.alpha <0.95f){cGroup.alpha = Mathf.Lerp(cGroup.alpha,1,Time.deltaTime * fadeSpeed);yield return null;}cGroup.alpha = 1;if(callback!= null)foreach(回调中的动作a)a.Invoke();yield返回new WaitForSeconds(middleWaitTime);而(cGroup.alpha> 0.05f){cGroup.alpha = Mathf.Lerp(cGroup.alpha,0,Time.deltaTime * fadeSpeed);yield return null;}if(finalCallback!= null)finalCallback.Invoke();cGroup.alpha = 0;inProgress = false;}}  

现在我们可以通过添加几行代来调用UIManager中的Fade()方法:

 使用UnityEngine;公共enum小组{主要,在游戏中,暂停,褪色,没有}公共类UIManager:Singleton&lt; UIManager&gt;{[SerializeField]私人MainMenuPanel mainMenuPanel;[SerializeField]私人InGamePanel inGamePanel;[SerializeField]私有PausePanel pausePanel;[SerializeField]私人FadePanel fadePanel;public void Fade(Action finalCallback,params Action [] callback){StartCoroutine(fadePanel.Fade(finalCallback,callback));}public void SetPanel(面板类型){mainMenuPanel.gameObject.SetActive(type == Panel.Main);inGamePanel.gameObject.SetActive(type == Panel.InGame);pausePanel.gameObject.SetActive(type == Panel.Pause);}}  

为了调用淡出 - 淡入效果我需要的是在UIManager上调用Fade()方法。

我在最近的几个项目中一直在使用这个设计,到目前为止,我发现它非常有用,有条理且易于调试。如果这在某种程度上是一种不好的做法或者是否可以改进,请告诉我。如果你知道的话,我想学习更好的组织用户界面的方法。

相关文章:分析检查

    上一篇:主要经销商G2A希望通过前端验证来确保市场安全
    下一篇:巴斯!好莱坞宣布