Unity2D入门(八):游戏场景中的UI(主菜单与暂停菜单)

因为暑假跟着老师做大创项目,需要用到UI方面的内容,所以在这里先记下关于UI的内容。目前我的游戏已经有了基本的雏形,现在的情况是在回补之前落下的笔记,因为大创的缘故我的学习进度和笔记进度差了好多,好纠结到底要不要继续补上(

在之后的笔记中,我会加入自己大创项目中的一些内容,本篇总结的是M_Studio教学中的P25、26两节,以及

一、主菜单:

主菜单相当于是一个新的场景,在Scene文件夹下创建一个新的Scene名为Menu,进入新场景在Hierarchy窗口中新建一个panel,在游戏场景中可以看到生成了一个类似蒙版的东西,在右侧Inspector窗口中的SourceImage中为其添加我们需要的背景图片,如果不做此步操作的话,这个Panel并不能填充整个画面,这是一个圆角矩形,要是没有图面我们也要在SourceImage中选择None。

接下来我们为主菜单添加按钮:play和quit。我们再创建一个Panel,用来盖住上面一个Panel创建的图片,在上面添加两个按钮,有两种Button,后面带TextMeshPro的是可以添加艺术字的,我们选择这个。

添加完成标题和按钮后效果如图(忽略这个阴间配色……),在这里补充,选中任何一个Button,在右侧Inspector窗口中,Button组件可以调整按钮在平时、光标选中、点击时的颜色,在此不做演示。

下一步我们要为按钮添加功能,开始游戏和退出游戏,直接上代码

    public void PlayGame()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
    }
    public void QuiteGame()
    {
        Application.Quit();
    }

退出游戏QuitGame()函数没有什么好说的,PlayGame中用到了SceneManager中的一些函数,在最开始要导入UnityEngine.SceneManager这个包,LoadScene函数是用来加载场景的,我们要从主菜单跳到第一关,所以是在当前场景编号的基础上+1,具体设置在File->BuiSettings中,我们可以在ScenesInBuild窗口中调整这几个场景的编号顺序,将主菜单调整到第一关前面,就实现了PlayGame函数的功能。

之后我们把脚本挂在到Canvas上Play和Quit的父级物体也就是Menu上,在Button的Inspector窗口中有一个OnClick选项,点击右下方的加号,将刚才挂载脚本的物体拖过来,选择挂载脚本的名称,就能在里面找到我们刚才写好的函数了。

在此我们就实现了基本的主菜单功能。

接下来我们要为主菜单录制一段入场动画,具体效果我在这用文字表述:为盖在图片上的那层Panel的不透明度打上关键帧,逐渐提高他的不透明度,在动画播放完成后主菜单上的文字才显示出来。

首先我们选中Panel,为他新建一个动画,点击红点录制,在开始出把他的不透明度设置一个值,结束处设置另一个值,在不同位置设置不同的 值Unity会自动添加关键帧。

接下来我们在Menu菜单中添加一个让文字显示出来的函数UIAble,直接上代码:

    public void UIable()
    {
        GameObject.Find("Canvas/Menu/UI").SetActive(true);
    }

这句代码的意思就是,程序在Hierarchy窗口中寻找到我要找的内容,也就是文字,并把它的激活状态设置true。

回到Unity中,在刚才的Animation窗口中,我们为在结尾处添加一个事件,也就是UIAble()函数。这样就完成了动画的创建。

 二、暂停菜单:

回到我们的游戏场景中,我们现在要为游戏添加暂停菜单,第一步肯定是要先创建一个暂停的按钮,在此不做赘述。

下面我们来实现按钮按下后要实现的功能:弹出一个菜单,这一步我们需要创建一个Panel,调整好这个panel的大小,并为其添加一个音量的滑条slider(这个设计到音频控件,之后再说),和一个Resume返回游戏的按钮。效果如图:

 首先我们来实现点击Pause按钮可以弹出菜单:仔细分析不难发现这个和主菜单中那个实现UIAble的函数大同小异,这里我们换一种写法,上代码:

    public GameObject PauseGame;

    public void PauseMenu()
    {
        PauseGame.SetActive(true);
        Time.timeScale = 0f;
    }
    public void ResumeGame()
    {
        PauseGame.SetActive(false);
        Time.timeScale = 1f;
    }

 可以看出只不过是这种写法是我们手动把PauseMenu给到了代码,而上面一种方式是通过查找的方式,但两者都是通过SetActive实现的,其实这个过程也不一定非要使用代码,Unity中直接就有SetActive的设置。

  • 14
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity,我们可以使用自定义脚本来为Button绘制圆角外边框。以下是一个简单的示例: 1. 首先,创建一个空的GameObject并将其命名为"RoundButton"。 2. 在RoundButton上添加一个Button组件,以便我们能够使用UnityUI系统。 3. 创建一个新的C#脚本,将其命名为"RoundButtonScript"。 4. 在RoundButtonScript添加以下代码: ```csharp using UnityEngine; using UnityEngine.UI; [RequireComponent(typeof(Image))] public class RoundButtonScript : MonoBehaviour { public int cornerRadius = 10; // 圆角半径 private Image buttonImage; void Awake() { buttonImage = GetComponent<Image>(); DrawRoundBorder(); } void DrawRoundBorder() { // 获取Button的RectTransform组件 RectTransform rectTransform = GetComponent<RectTransform>(); // 创建一个带圆角的Sprite Sprite borderSprite = CreateRoundBorderSprite(rectTransform.sizeDelta); // 将Sprite设置为Button的背景图像 buttonImage.sprite = borderSprite; } Sprite CreateRoundBorderSprite(Vector2 size) { // 创建一个新的纹理 Texture2D texture = new Texture2D((int)size.x, (int)size.y); // 循环遍历纹理像素,根据圆角半径绘制圆角外边框 for (int x = 0; x < size.x; x++) { for (int y = 0; y < size.y; y++) { if (IsInRoundCorner(x, y, size)) { texture.SetPixel(x, y, Color.black); } else { texture.SetPixel(x, y, Color.clear); } } } // 应用修改后的纹理 texture.Apply(); // 创建一个新的Sprite并返回 Sprite sprite = Sprite.Create(texture, new Rect(0, 0, size.x, size.y), new Vector2(0.5f, 0.5f)); return sprite; } bool IsInRoundCorner(int x, int y, Vector2 size) { float centerX = Mathf.Clamp(x, cornerRadius, size.x - cornerRadius); float centerY = Mathf.Clamp(y, cornerRadius, size.y - cornerRadius); float distX = centerX - x; float distY = centerY - y; return (distX * distX) + (distY * distY) <= (cornerRadius * cornerRadius); } } ``` 5. 将RoundButtonScript脚本附加到RoundButton对象上,并在cornerRadius变量设置所需的圆角半径值。 6. 运行游戏,你会看到Button上绘制了一个具有圆角边框的圆形外形。 这就是使用Unity为Button绘制圆角外边框的简单方法。你可以根据需要修改脚本的参数来获得不同的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值