首页 >科技周边 >IT业界 >在Unity中添加暂停,主菜单和游戏

在Unity中添加暂停,主菜单和游戏

William Shakespeare
William Shakespeare原创
2025-02-19 10:44:11637浏览

在Unity中添加暂停,主菜单和游戏

在玩游戏时可以看到什么按钮,文本,下拉列表等?所有这些都是所谓的用户界面(UI)的一部分。大多数游戏都具有某种UI,这使玩家更容易在级别之间切换并激活某些控件(例如暂停游戏或重新启动级别)。在上一篇描述如何创建Dodger的文章中,我们创建了一个小按钮,以刷新游戏,如果玩家丢失了。 在本教程中,我们将将其提升到一个新的水平,并允许用户暂停或重新启动游戏并在不同场景之间切换。我们还将研究如何仅在某些时间显示某些UI元素 - 例如游戏暂停或玩家死亡/失败时。

>大多数游戏都包含暂停菜单,屏幕上的游戏和主菜单。由于这些是“完成”游戏所需的几个元素中的一些,因此我们将将所有三个元素插入我们的躲避克隆中。此外,我们还将创建一个指令屏幕,以便玩家能够在开始玩游戏之前可以学习可以使用的控件。在Unity中添加暂停,主菜单和游戏>

完整的游戏可以在itch.io中玩

钥匙要点

>通过提供必需的UI控件和场景管理来实现Unity的屏幕上的暂停,主菜单和游戏。

>使用`time.timescale`控制游戏状态,将其设置为0暂停游戏,然后恢复1个,启用有效的暂停菜单功能。
    >
  • >创建不同游戏状态的不同的UI元素,例如按钮和文本,并使用诸如“ ShowonPause”之类的标签来管理其可见性。
  • >开发一个主菜单场景,其中包含启动游戏的选项,利用``sceemanager''进行场景过渡来增强用户导航。
  • >使用碰撞检测和UI更新将屏幕上的游戏与分数显示和重新启动选项合并,以告知玩家游戏End。
  • 创建基本暂停屏幕
  • >暂停屏幕具有一组通用的控件,玩家可以使用该控件来重新启动一个级别,转到主菜单或取消游戏。暂停屏幕仅在暂停游戏时才能看到。一般而言,我们可以使用Times.Timescale来区分暂停和未陷入困境的游戏。如果时间尺度为零,则游戏将被暂停。如果大于零,则该游戏将不会引起(我们稍后将讨论)。让我们开始!
创建暂停文本

首先,我们将需要创建一个标题,该标题告诉玩家暂停游戏。我们应该通过在层次结构窗格中右键单击并选择UI->文本来创建一个文本对象。让我们命名新创建的对象pauseText。

我们需要创建一个标题,该标题告诉玩家暂停游戏。我们应该通过在层次结构窗格中右键单击并选择UI->文本来创建一个文本对象。让我们命名新创建的对象pauseText。

>现在我们可以格式化文本对象,以使其在游戏屏幕中看起来更好。为了更改文本对象的文本,我们必须在“新文本”单词所在的文本属性下单击“检查器”窗格。在文本属性中,我们可以将暂停文本的文本更改为“暂停”。为了保持游戏的配色方案,我们应该将文本的颜色更改为白色。这可以通过在颜色对象(可以选择黑色或其他颜色)下单击并选择白色来实现。

>

在Unity中添加暂停,主菜单和游戏

>让我们调整文本的位置。暂停文本应水平集中在屏幕上,并位于游戏屏幕的最高三分之一。可以通过更改RECT变换属性内部的x和y的值或使用Unity编辑器左上角的鼠标控件中的四个方式箭头来移动暂停文本。如果需要或需要,我们还可以通过更改值和更改宽度和高度属性的大小(在Rect Transform下)来更改文本大小。

>

>我们现在要做的就是标记对象,以便在添加代码后的程序将能够说我们只希望该对象显示游戏何时暂停。我们可以单击“暂停文本”的名称,其中显示“未标记”,然后单击“添加标签……”。现在,我们可以创建一个名为“ ShowonPause”的标签。创建此标签后,我们需要将其添加到暂停文本中。

>

创建暂停的按钮

>由于我们创建了暂停文本并为游戏对象添加了一个新标签,该标签应该在暂停游戏时出现,因此我们可以开始创建构成暂停游戏菜单的按钮。

>我们将创建三个不同的按钮:播放按钮,重新启动按钮和主菜单按钮。播放按钮将取消游戏,重新启动按钮将重新启动游戏,并且主菜单按钮将使玩家重新回到游戏的主菜单场景。

开始,让我们从创建一个新按钮(右键单击层次结构 - > ui->按钮),然后将其命名为“ PlayButton”。我们应该将播放按钮的标签设置为ShowonPause,以便仅在暂停游戏时才显示它。现在,让我们将播放按钮的文本设置为“播放”。这可以通过在检查员中打开文本子对象(单击层次结构中的播放按钮旁边的下拉列表,然后选择文本对象),然后将文本属性更改为“ play”。我们应该将播放按钮与屏幕的中心对齐,以便它在暂停文本下。

创建其他两个按钮的快速方法是在层次结构中选择“播放”按钮,并两次重复(命令 / ctrl d)。我们可以将新按钮命名为“ RestartButton”和“ Mainmenubutton”。我们还应该给每个新按钮提供适当的文本。重新启动按钮应表示“重新启动”,主菜单按钮应为“主菜单”。现在,让我们删除上一个教程中创建的刷新按钮。现在我们可以看到我们有一个基本的暂停菜单。但是,菜单什么也没做任何事情,因为我们还没有将任何代码附加到对象上。

>

在Unity中添加暂停,主菜单和游戏

>让我们打开上一个教程中创建的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”。

>

在Unity中添加暂停,主菜单和游戏

>如果我们现在打播放,我们会注意到播放和重新启动按钮可以正常工作。另外,如果我们在游戏玩游戏时达到P,我们就可以暂停并取消游戏。唯一的问题是主菜单按钮不起作用。这是因为我们还没有在构建设置中添加名为“ Mainmenu”的场景。

创建主菜单场景

创建场景

>在播放场景中创建的暂停菜单后,我们现在可以创建一个新的场景,该场景将充当游戏的主菜单。我们将创建的主菜单将很简单,并且只包含一个播放按钮,该按钮将使玩家进入播放场景。

首先,我们应该保存我们正在工作的当前场景,以便我们完成的工作不会被删除。让我们创建一个新场景(命令 / ctrl n或file->新场景)。场景打开后,保存并将其命名为“ Mainmenu”。

>

在Unity中添加暂停,主菜单和游戏>

注意:我们将其命名为“ Mainmenu”,因为这是我们在播放场景中设置主菜单按钮的字符串属性。如果我们想要一个其他名称,那么我们可以更改play场景中主菜单按钮附加的LoadLevel()函数的字符串属性。

创建菜单

>现在已经保存了场景,我们可以开始对其进行努力。让我们从选择主摄像机游戏对象并将其背景更改为与游戏场景相同的颜色(R:0,G:223,B:255)。 在此场景中,我们将需要能够访问Uimanager脚本中的LoadLevel()方法。这意味着我们需要创建一个uimanager游戏对象并将Uimanager脚本附加到它,以便我们可以将功能添加到我们的按钮中。

>

>让我们创建一个空的游戏对象(在层次结构中右键单击 - >“创建空”),然后将其命名为Uimanager。现在,我们可以将Uimanager脚本添加到Uimanager游戏对象中。>

>我们可以开始创建一个简单的菜单,该菜单包含文本,其中包含“躲避”和播放按钮。我们将首先创建文本(右键单击层次结构 - > ui->文本),然后将其命名为“ Titletlext”。我们应该更改文本以说“躲闪”,然后将其对齐到屏幕的中心,朝向顶部。现在,让我们将标题文本的颜色设置为白色。

>使用创建和编辑的文本,我们可以创建一个新按钮并将其命名为“ PlayButton”。我们应该将播放按钮的子对象的文本更改为“播放”。最后,让我们将Uimanager Game对象添加到按钮的OnClick()属性中,然后选择LoadLevel()函数。 LOADLEVEL()函数的参数取决于上一个教程中播放场景的名称。我们可以通过在Assets Pane中找到场景来找到游戏场景的名称。

如果我们运行游戏并点击播放按钮,我们会注意到该按钮不起作用。原因与主菜单按钮在我们的播放场景中不起作用时相同:我们尚未将Mainmenu场景添加到构建设置中。要将当前场景添加到构建设置中,我们可以打开构建设置(文件 - >构建设置),然后单击“添加当前”。

>完成游戏在Unity中添加暂停,主菜单和游戏

为了使游戏被视为“完成”,需要在屏幕上进行游戏,以便玩家能够分辨出他们何时输了。我们还将在游戏中添加分数计数器,因此玩家将知道他们的得分高。

添加分数

>我们应该保存当前的场景并打开播放场景。播放场景打开,我们可以创建一个文本对象并将其命名为“ ScoreText”。得分文本对象应与屏幕顶部对齐。通过选择的分数文本对象,我们可以通过查看RECT变换属性并单击锚点菜单来添加顶部拉伸锚点。我们还应该将文本置于中心并使其为白色。

我们将用来更新分数的条件将是从屏幕上脱离屏幕的块(这意味着玩家已经躲避的块)。为了使这种情况保持活跃

>让我们创建一个空的游戏对象并将其命名为“ Bottomborder”。我们在底部边框中添加了一个BoxCollider2D,并将X尺寸设置为一个略微超过相机边界的大数字。现在,我们可以在底部边框对象中添加一个刚体2D,并将重力刻度属性设置为0,以免底部边框对象落下。我们可以将底部边框对象稍微对准播放器下方,以确保其不在屏幕上。>

>我们需要创建一个新脚本才能为玩家设置分数。让我们在脚本文件夹中创建一个名为“ PointCounter”的新C#脚本。一旦创建了点counter脚本,我们就可以在我们的IDE中打开它:

>

>
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脚本:

>

我们应该将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>
为了完成游戏,我们需要在玩家死亡时出现的菜单上添加一个游戏。

>让我们在我们的IDE中打开PlayerController脚本,下面是最后一个变量声明添加:

>内部的敌方脚本脚本,让我们添加:

>

开始播放菜单,我们可以创建一个新的文本游戏对象并将其命名为“ GameOverText”。文本应设置为“游戏”,文本颜色应为白色。我们应该将游戏通过文本对齐,以略高于屏幕中心的上方。为了确保只有在玩家死亡时才会出现此菜单,我们应该创建一个名为“ ShowonFinish”的新标签,并通过文本将其添加到游戏中。

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标签添加到两个按钮中。

>

>最后,让我们在IDE中打开Uimanager脚本并进行编辑,以使其看起来像下面的代码。
public bool alive<span>;
</span>	<span>// Use this for initialization
</span>	<span>void Start () {
</span>		alive <span>= true;
</span>	<span>}
</span>

结论

>我们现在已经为游戏添加了一个简单的UI。现在,玩家将能够使用按钮在两个场景中移动。我们还获得了模块化统一开发和干燥编码的经验(不要自行重复)。我们创建得分文本的方式是一个很好的例子,说明了如何将统一代码分配以使其可回收。
<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>

>问题?评论?请把它们留在下面!在Unity中添加暂停,主菜单和游戏>

完成的项目可以从GitHub下载。

>

>在Unity中添加暂停,主菜单和游戏的常见问题(常见问题解答)

>如何添加Unity的暂停按钮?

>在Unity中添加暂停按钮涉及创建UI按钮并将脚本附加到控制游戏时间尺度的脚本。时间尺度是一个全球乘数,会影响游戏时间进步的速度。通过将其设置为零,您可以有效地暂停游戏。暂停按钮附加的脚本应包含一个函数,该函数在单击按钮时切换时间尺度(正常速度)和0(暂停)。

如何创建Unity的主菜单?>>我如何通过unity添加游戏? Unity的屏幕类似于添加主菜单。您需要创建一个新场景,该场景将用作屏幕上的游戏,并配有为玩家提供选项的UI元素,例如重新启动游戏或返回主菜单。这些元素应附加附加脚本,该脚本在单击时执行适当的操作。

>如何使用SceneManager类来完成Unity的场景之间的过渡?此类提供用于加载和卸载场景的功能,以及查询有关当前场景的信息。要过渡到新场景,您可以使用SceneManager.loadScene函数,以要加载的场景的名称或索引传递。

>

如何自定义UI元素的外观?

Unity提供了多种选择,以自定义UI元素的外观。您可以在Unity编辑器中直接调整颜色,大小和位置等属性。对于更高级的自定义,您可以使用UI系统的功能强大的动画功能,甚至可以通过扩展现有类来创建自己的自定义UI组件。

如何在UI元素中添加声音效果? >

>可以通过将AudioSource组件附加到元素上并在与元素进行配置时将声音效果添加到UI元素中,并在与该元素进行交互时播放声音。例如,您可以在按下按钮时配置一个按钮以播放单击声。

>如何使我的UI响应统一的不同屏幕尺寸?

Unity的UI系统包含一个称为Canvas Scaleer的功能,该功能使创建UI易于制作并调整到不同屏幕尺寸的UI。通过将Canvas Scaleer的UI量表模式设置为“与屏幕尺寸进行缩放”,您可以确保您的UI元素在不同设备上保持一致的尺寸和布局。

如何统一测试我的UI? 可以直接在Unity编辑器中进行UI测试UI。游戏视图提供了您游戏的实时预览,包括任何UI元素。您可以像玩家在实际游戏中一样在游戏视图中与UI进行互动,从而可以测试功能并检查任何问题。

>

如何优化我的UI以unity的性能? >

>优化UI以统一性的性能涉及各种策略,例如最大程度地减少复杂图形的使用,避免不必要的更新,并使用Canvas Scaleer来减少分辨率您在低端设备上的UI。 Unity的Profiler工具可以是确定UI中性能瓶颈的宝贵资源。

>

>我如何了解有关Unity的UI系统的更多信息? API参考和最佳实践。此外,在许多在线社区和资源中,您可以从其他Unity开发人员那里学习,例如Unity论坛,堆栈溢出和各种教程网站。

以上是在Unity中添加暂停,主菜单和游戏的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn