在玩游戏时可以看到什么按钮,文本,下拉列表等?所有这些都是所谓的用户界面(UI)的一部分。大多数游戏都具有某种UI,这使玩家更容易在级别之间切换并激活某些控件(例如暂停游戏或重新启动级别)。在上一篇描述如何创建Dodger的文章中,我们创建了一个小按钮,以刷新游戏,如果玩家丢失了。 在本教程中,我们将将其提升到一个新的水平,并允许用户暂停或重新启动游戏并在不同场景之间切换。我们还将研究如何仅在某些时间显示某些UI元素 - 例如游戏暂停或玩家死亡/失败时。
>大多数游戏都包含暂停菜单,屏幕上的游戏和主菜单。由于这些是“完成”游戏所需的几个元素中的一些,因此我们将将所有三个元素插入我们的躲避克隆中。此外,我们还将创建一个指令屏幕,以便玩家能够在开始玩游戏之前可以学习可以使用的控件。>
钥匙要点
>通过提供必需的UI控件和场景管理来实现Unity的屏幕上的暂停,主菜单和游戏。
我们需要创建一个标题,该标题告诉玩家暂停游戏。我们应该通过在层次结构窗格中右键单击并选择UI->文本来创建一个文本对象。让我们命名新创建的对象pauseText。
>现在我们可以格式化文本对象,以使其在游戏屏幕中看起来更好。为了更改文本对象的文本,我们必须在“新文本”单词所在的文本属性下单击“检查器”窗格。在文本属性中,我们可以将暂停文本的文本更改为“暂停”。为了保持游戏的配色方案,我们应该将文本的颜色更改为白色。这可以通过在颜色对象(可以选择黑色或其他颜色)下单击并选择白色来实现。
>
>让我们调整文本的位置。暂停文本应水平集中在屏幕上,并位于游戏屏幕的最高三分之一。可以通过更改RECT变换属性内部的x和y的值或使用Unity编辑器左上角的鼠标控件中的四个方式箭头来移动暂停文本。如果需要或需要,我们还可以通过更改值和更改宽度和高度属性的大小(在Rect Transform下)来更改文本大小。
>>我们现在要做的就是标记对象,以便在添加代码后的程序将能够说我们只希望该对象显示游戏何时暂停。我们可以单击“暂停文本”的名称,其中显示“未标记”,然后单击“添加标签……”。现在,我们可以创建一个名为“ ShowonPause”的标签。创建此标签后,我们需要将其添加到暂停文本中。
>>由于我们创建了暂停文本并为游戏对象添加了一个新标签,该标签应该在暂停游戏时出现,因此我们可以开始创建构成暂停游戏菜单的按钮。
>我们将创建三个不同的按钮:播放按钮,重新启动按钮和主菜单按钮。播放按钮将取消游戏,重新启动按钮将重新启动游戏,并且主菜单按钮将使玩家重新回到游戏的主菜单场景。开始,让我们从创建一个新按钮(右键单击层次结构 - > ui->按钮),然后将其命名为“ PlayButton”。我们应该将播放按钮的标签设置为ShowonPause,以便仅在暂停游戏时才显示它。现在,让我们将播放按钮的文本设置为“播放”。这可以通过在检查员中打开文本子对象(单击层次结构中的播放按钮旁边的下拉列表,然后选择文本对象),然后将文本属性更改为“ play”。我们应该将播放按钮与屏幕的中心对齐,以便它在暂停文本下。
创建其他两个按钮的快速方法是在层次结构中选择“播放”按钮,并两次重复(命令 / ctrl d)。我们可以将新按钮命名为“ RestartButton”和“ Mainmenubutton”。我们还应该给每个新按钮提供适当的文本。重新启动按钮应表示“重新启动”,主菜单按钮应为“主菜单”。现在,让我们删除上一个教程中创建的刷新按钮。现在我们可以看到我们有一个基本的暂停菜单。但是,菜单什么也没做任何事情,因为我们还没有将任何代码附加到对象上。
>
>让我们打开上一个教程中创建的uimanager脚本。我们应该编辑我们的uimanager脚本,以使其看起来像下面的代码。
>GameObject<span>[] pauseObjects; </span> <span>// Use this for initialization </span> <span>void Start () { </span> Time<span>.timeScale = 1; </span> pauseObjects <span>= GameObject.FindGameObjectsWithTag("ShowOnPause"); </span> <span>hidePaused(); </span> <span>} </span> <span>// Update is called once per frame </span> <span>void Update () { </span> <span>//uses the p button to pause and unpause the game </span> <span>if(Input.GetKeyDown(KeyCode.P)) </span> <span>{ </span> <span>if(Time.timeScale == 1) </span> <span>{ </span> Time<span>.timeScale = 0; </span> <span>showPaused(); </span> <span>} else if (Time.timeScale == 0){ </span> Debug<span>.Log ("high"); </span> Time<span>.timeScale = 1; </span> <span>hidePaused(); </span> <span>} </span> <span>} </span> <span>} </span> <span>//Reloads the Level </span> public <span>void Reload(){ </span> Application<span>.LoadLevel(Application.loadedLevel); </span> <span>} </span> <span>//controls the pausing of the scene </span> public <span>void pauseControl(){ </span> <span>if(Time.timeScale == 1) </span> <span>{ </span> Time<span>.timeScale = 0; </span> <span>showPaused(); </span> <span>} else if (Time.timeScale == 0){ </span> Time<span>.timeScale = 1; </span> <span>hidePaused(); </span> <span>} </span> <span>} </span> <span>//shows objects with ShowOnPause tag </span> public <span>void showPaused(){ </span> <span>foreach(GameObject g in pauseObjects){ </span> g<span>.SetActive(true); </span> <span>} </span> <span>} </span> <span>//hides objects with ShowOnPause tag </span> public <span>void hidePaused(){ </span> <span>foreach(GameObject g in pauseObjects){ </span> g<span>.SetActive(false); </span> <span>} </span> <span>} </span> <span>//loads inputted level </span> public <span>void LoadLevel(string level){ </span> Application<span>.LoadLevel(level); </span> <span>} </span>
>现在,我们已经有了可以在Uimanager脚本中访问的代码,我们可以返回Unity。在Unity内部,让我们选择“播放”按钮,然后将PauseControl方法附加到它。为此,我们可以选择“播放”按钮并将Uimanager Game对象拖到Inspector Pane中OnClick()属性下的游戏对象空间上。添加了Uimanager游戏对象,我们现在可以使用第二个下拉列表选择PauseControl函数(uimanager-> pausecontrol)。
>>使用相同的步骤,我们可以将Reload()方法添加到重新启动按钮和LoadLevel()方法到主菜单按钮。由于LoadLevel()方法采用字符串参数,因此我们应该在函数下拉列表下的框中键入“ mainmenu”。
>
>如果我们现在打播放,我们会注意到播放和重新启动按钮可以正常工作。另外,如果我们在游戏玩游戏时达到P,我们就可以暂停并取消游戏。唯一的问题是主菜单按钮不起作用。这是因为我们还没有在构建设置中添加名为“ Mainmenu”的场景。
创建主菜单场景首先,我们应该保存我们正在工作的当前场景,以便我们完成的工作不会被删除。让我们创建一个新场景(命令 / ctrl n或file->新场景)。场景打开后,保存并将其命名为“ Mainmenu”。
>
>
>现在已经保存了场景,我们可以开始对其进行努力。让我们从选择主摄像机游戏对象并将其背景更改为与游戏场景相同的颜色(R:0,G:223,B:255)。
在此场景中,我们将需要能够访问Uimanager脚本中的LoadLevel()方法。这意味着我们需要创建一个uimanager游戏对象并将Uimanager脚本附加到它,以便我们可以将功能添加到我们的按钮中。 >让我们创建一个空的游戏对象(在层次结构中右键单击 - >“创建空”),然后将其命名为Uimanager。现在,我们可以将Uimanager脚本添加到Uimanager游戏对象中。
>完成游戏 添加分数 我们将用来更新分数的条件将是从屏幕上脱离屏幕的块(这意味着玩家已经躲避的块)。为了使这种情况保持活跃 >让我们创建一个空的游戏对象并将其命名为“ Bottomborder”。我们在底部边框中添加了一个BoxCollider2D,并将X尺寸设置为一个略微超过相机边界的大数字。现在,我们可以在底部边框对象中添加一个刚体2D,并将重力刻度属性设置为0,以免底部边框对象落下。我们可以将底部边框对象稍微对准播放器下方,以确保其不在屏幕上。 >
>
我们应该将PointUpDater脚本添加到得分文本游戏对象中。底部边框游戏对象应添加到点计数器值中,以便可以更新分数。 >让我们在我们的IDE中打开PlayerController脚本,下面是最后一个变量声明添加: >
开始播放菜单,我们可以创建一个新的文本游戏对象并将其命名为“ GameOverText”。文本应设置为“游戏”,文本颜色应为白色。我们应该将游戏通过文本对齐,以略高于屏幕中心的上方。为了确保只有在玩家死亡时才会出现此菜单,我们应该创建一个名为“ ShowonFinish”的新标签,并通过文本将其添加到游戏中。 >
>问题?评论?请把它们留在下面! Unity的UI系统包含一个称为Canvas Scaleer的功能,该功能使创建UI易于制作并调整到不同屏幕尺寸的UI。通过将Canvas Scaleer的UI量表模式设置为“与屏幕尺寸进行缩放”,您可以确保您的UI元素在不同设备上保持一致的尺寸和布局。 > >我如何了解有关Unity的UI系统的更多信息? API参考和最佳实践。此外,在许多在线社区和资源中,您可以从其他Unity开发人员那里学习,例如Unity论坛,堆栈溢出和各种教程网站。创建菜单
>我们应该保存当前的场景并打开播放场景。播放场景打开,我们可以创建一个文本对象并将其命名为“ ScoreText”。得分文本对象应与屏幕顶部对齐。通过选择的分数文本对象,我们可以通过查看RECT变换属性并单击锚点菜单来添加顶部拉伸锚点。我们还应该将文本置于中心并使其为白色。
GameObject<span>[] pauseObjects;
</span>
<span>// Use this for initialization
</span> <span>void Start () {
</span> Time<span>.timeScale = 1;
</span> pauseObjects <span>= GameObject.FindGameObjectsWithTag("ShowOnPause");
</span> <span>hidePaused();
</span> <span>}
</span>
<span>// Update is called once per frame
</span> <span>void Update () {
</span>
<span>//uses the p button to pause and unpause the game
</span> <span>if(Input.GetKeyDown(KeyCode.P))
</span> <span>{
</span> <span>if(Time.timeScale == 1)
</span> <span>{
</span> Time<span>.timeScale = 0;
</span> <span>showPaused();
</span> <span>} else if (Time.timeScale == 0){
</span> Debug<span>.Log ("high");
</span> Time<span>.timeScale = 1;
</span> <span>hidePaused();
</span> <span>}
</span> <span>}
</span> <span>}
</span>
<span>//Reloads the Level
</span> public <span>void Reload(){
</span> Application<span>.LoadLevel(Application.loadedLevel);
</span> <span>}
</span>
<span>//controls the pausing of the scene
</span> public <span>void pauseControl(){
</span> <span>if(Time.timeScale == 1)
</span> <span>{
</span> Time<span>.timeScale = 0;
</span> <span>showPaused();
</span> <span>} else if (Time.timeScale == 0){
</span> Time<span>.timeScale = 1;
</span> <span>hidePaused();
</span> <span>}
</span> <span>}
</span>
<span>//shows objects with ShowOnPause tag
</span> public <span>void showPaused(){
</span> <span>foreach(GameObject g in pauseObjects){
</span> g<span>.SetActive(true);
</span> <span>}
</span> <span>}
</span>
<span>//hides objects with ShowOnPause tag
</span> public <span>void hidePaused(){
</span> <span>foreach(GameObject g in pauseObjects){
</span> g<span>.SetActive(false);
</span> <span>}
</span> <span>}
</span>
<span>//loads inputted level
</span> public <span>void LoadLevel(string level){
</span> Application<span>.LoadLevel(level);
</span> <span>}
</span>
>现在,让我们创建一个名为“ PointUpdater”的脚本,该脚本将更新分数文本。我们可以在IDE和类型中打开pointupdater脚本:public <span>int score;
</span>
<span>// Use this for initialization
</span> <span>void Start () {
</span> score <span>= 0;
</span> <span>}
</span>
<span>// Update is called once per frame
</span> <span>void Update () {
</span>
<span>}
</span>
<span>//checks for entering a trigger
</span> <span>void OnTriggerEnter2D(Collider2D other){
</span> <span>//checks other collider's tag
</span> <span>if(other.gameObject.tag == "Enemy"){
</span> score<span>++; //increments score
</span> <span>Destroy (other.gameObject); //destroys other collider's gameobject
</span> <span>}
</span> <span>}
</span>
为了完成游戏,我们需要在玩家死亡时出现的菜单上添加一个游戏。
>内部的敌方脚本脚本,让我们添加:public PointCounter pointCounter<span>;
</span> <span>// Use this for initialization
</span> <span>void Start () {
</span> text <span>= gameObject.GetComponent<Text>();
</span> text<span>.text = "Score: 0";
</span> <span>}
</span>
<span>// Update is called once per frame
</span> <span>void Update () {
</span> text<span>.text = "Score: " + pointCounter.score.ToString();
</span>
<span>}
</span>
现在,让我们复制重新启动和主菜单按钮。我们应该将按钮重命名为“ FinrestartButon”和“ FinmainMenubutton”,然后将ShowonFinish标签添加到两个按钮中。public bool alive<span>;
</span> <span>// Use this for initialization
</span> <span>void Start () {
</span> alive <span>= true;
</span> <span>}
</span>
<span>void OnTriggerEnter2D(Collider2D other){
</span>
<span>//Checks if other gameobject has a Tag of Player
</span> <span>if(other.gameObject.tag == "Player"){
</span> other<span>.gameObject.GetComponent<PlayerController>().alive = false;
</span> Time<span>.timeScale = 0;
</span> <span>}
</span><span>}
</span>
>
完成的项目可以从GitHub下载。
>>在Unity中添加暂停,主菜单和游戏的常见问题(常见问题解答)
>如何添加Unity的暂停按钮?>在Unity中添加暂停按钮涉及创建UI按钮并将脚本附加到控制游戏时间尺度的脚本。时间尺度是一个全球乘数,会影响游戏时间进步的速度。通过将其设置为零,您可以有效地暂停游戏。暂停按钮附加的脚本应包含一个函数,该函数在单击按钮时切换时间尺度(正常速度)和0(暂停)。>
如何自定义UI元素的外观? Unity提供了多种选择,以自定义UI元素的外观。您可以在Unity编辑器中直接调整颜色,大小和位置等属性。对于更高级的自定义,您可以使用UI系统的功能强大的动画功能,甚至可以通过扩展现有类来创建自己的自定义UI组件。如何在UI元素中添加声音效果? >
>可以通过将AudioSource组件附加到元素上并在与元素进行配置时将声音效果添加到UI元素中,并在与该元素进行交互时播放声音。例如,您可以在按下按钮时配置一个按钮以播放单击声。>如何使我的UI响应统一的不同屏幕尺寸?
>优化UI以统一性的性能涉及各种策略,例如最大程度地减少复杂图形的使用,避免不必要的更新,并使用Canvas Scaleer来减少分辨率您在低端设备上的UI。 Unity的Profiler工具可以是确定UI中性能瓶颈的宝贵资源。
>
以上是在Unity中添加暂停,主菜单和游戏的详细内容。更多信息请关注PHP中文网其他相关文章!