【Unity】制作一个简单的菜单栏页面并实现其功能

news2024/10/7 10:20:48

这是一个简单的菜单页面制作,接下来我们将制作一个完整的菜单页面,并且通过一定的代码去实现它对应的效果。这个主要的功能就是我们在游戏中如果想暂停一下或者重新开始,那么就要用到我们这个功能。接下来我们将实现在游戏中按ESC退出键可以调用菜单栏,然后游戏进行暂停。只有当我们再一次进行菜单栏选择系统会做出对应的反应。

1.创建UGUI组件

(1)接下来我们制作一下整个菜单页面的UGUI,其大致制作效果如下图,有一下细节我们需要注意就是设置好Canvas的分辨率并且在创建UI组件的过程每一个物体我们对需要设置好对应的锚点让它固定在这个位置,不会随分辨率大小而改变。造成后面比较麻烦,所以我们需早期设置好他。如:字体的大小、颜色、背景图片等...

(2).我们创建好的菜单页面基本大致就是下面图,我们在图中已经标明每一个组件对应每一个物体,为了让我们看起来更容易清晰明了。

 2.实现菜单显示和隐藏

(1).创建一个菜单管理类脚本,我们编写代码实现在游戏中我们隐藏菜单,按ESC退出键可以调用出菜单。菜单中所创建的button组件我们也需要让他呈现出对应的效果,接下来我们创建脚本。

 GameManager游戏管理类脚本:

代码实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    // Start is called before the first frame update

    //单例模式
    public static GameManager instance;

    //是否暂停
    public bool isPasue;
    //菜单面板
    public GameObject MenuPanel;
    void Start()
    {
        instance = this;
        //禁用
        MenuPanel.SetActive(false);
        isPasue = false;
    }
    void Update()
    {
        //如果按下ESC键游戏暂停,显示出菜单页面
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            //调用暂停游戏状态方法
            Pasue();
        }

    }
    //暂停游戏状态
    public void Pasue()
    {
        //暂停
        isPasue = true;
        //显示菜单页面
        MenuPanel.SetActive(true);
        Time.timeScale = 0;
    }

    //非暂停游戏状态
    public void UnPasue()
    {
        //非暂停
        isPasue = false;
        //隐藏菜单页面
        MenuPanel.SetActive(false);
        Time.timeScale = 1;
    }

    //重新开始游戏
    public void RestartGame()
    {
        //隐藏菜单面板
        MenuPanel.SetActive(false);
        //非暂停
        UnPasue();
        //分数清0
        ScoreManager.instance.score=0;

    }
    //继续游戏   从暂停状态切换到非暂停状态
    public void ContinueGame()
    {
        //调用非暂停游戏状态方法
        UnPasue();
    }
    //退出游戏
    public void QuitGame()
    {
        //退出游戏
        Application.Quit();
    }
}

(3).我们返回unity挂载对应的组件和对象。

  

3.效果图

(1)运行时。

(2)按ESC键。

(3)点击重新开始运行。

这里效果不太明显,下面我们等下接着测试。

4.实现分数效果

(1).我们创建一个ScoreManager分数管理类来编译分数变化情况。

 ScoreManager分数管理类脚本:

代码实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ScoreManager : MonoBehaviour
{
    // Start is called before the first frame update

    //单例模式
    public static ScoreManager instance;
    //文本
    public Text scoreText;

    public int score = 0;
    void Start()
    {
        instance = this;

    }

    // Update is called once per frame
    void Update()
    {
        //更新文本
        scoreText.text="分数:" + score.ToString();
    }

    //加分方法
    public void AddScore()
    {
        score += 1;
    }
}

(2).我们挂载对应的组件和对象。

 5.创建3D物体Cube

(1).我们创建一个cube,为了就是我们到时候鼠标点击它的时候可以加分,更好地看清楚它的效果。

调整一下它的大小。

(2).创建一个脚本挂载到cube组件上去,然后编写代码。

Cube代码:

代码实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SocialPlatforms.Impl;

public class Cube : MonoBehaviour
{
    // Start is called before the first frame update


    //是否在范围内
    bool isRange;
    //点击冷却
    public float ClickTime = 1f;
    //计时器
    public float timer;

    // Update is called once per frame
    void Update()
    {
        //只有当处于非暂停状态才能点击
        if (GameManager.instance.isPasue == false)
        {
            //开始计时
            timer += Time.deltaTime;
            //如果计时时间大于冷却时间并且在范围内
            if (timer > ClickTime && isRange)
            {
                //检测鼠标左键点击(按下瞬间)
                if (Input.GetMouseButtonDown(0))
                {
                    
                    ScoreManager.instance.AddScore();
                    //重置计时器
                    timer = 0f;
                   
                }
            }
        }
    }
    //鼠标点击触发检测
    private void OnMouseDown()
    {
        print("点击到了");
        isRange = true;
    }
    //鼠标离开对象时触发
    private void OnMouseExit()
    {
        isRange = false;
    }
}

 6.回到Unity引擎

(1).禁用菜单组件。

(2).检测有没有漏挂对象和脚本。

7.运行效果

(1).开始运行

(2).点击cube 

(3).按ESC退出键测试继续运行。

ContinueGame

 (4).按ESC退出键测试重新开始运行。

RestartGame

(5).总体效果。

Menu

 这是一个简单的menu页面制作,制作一个menu的UGUI效果会使我们的项目更加精美使整个项目效果更加完美。 你学会了吗?我已经学会了....


最后

以上步骤就是制作一个简单完整的菜单栏页面系统的整个流程。希望能对你们提供帮助!!!

看到的小伙伴一键三连一下吧,你们的支持让我更有动力去创作和分享,希望能一直为你带来惊喜和收获。

2413988ad82470fe49997fa97ee1adf8.png
一键三连吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/904212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第6步---MySQL的控制流语句和窗口函数

第6步---MySQL的控制流语句和窗口函数 1.IF关键字 -- 控制流语句 SELECT IF(5>3,大于,小于);-- 会单独生成一列的 SELECT *,IF(score >90 , 优秀, 一般) 等级 FROM stu_score;-- IFNULL(expr1,expr2) SELECT id,name ,IFNULL(salary,0),dept_id FROM emp4;-- ISNULL() …

【C语言学习】数组

定义数组 <类型>变量名称[元素变量] 元素数量必须是整数 int a[10]; double b[20]; scanf("%d",&a[i]);//输入数组数组 数组是一种容器&#xff0c;特点为其中所有元素具有相同的数据类型&#xff1b; 一旦创建&#xff0c;不能改变大小&#xff1b; 数…

【C语言】什么是结构体内存对齐?结构体的大小怎么计算?

目录 1.结构体内存对齐 对偏移量的理解&#xff1a;​ 2.结构体的大小计算 2.1结构体中只有普通的数据类型的大小计算 2.2 结构体中有嵌套的结构体的大小计算 3.修改默认对齐数 4.为什么存在内存对齐? 这篇文章主要介绍结构体内存对齐和如何计算大小。 在学习结构体内存…

个性化定制界面 VS 极简版原装界面:你更喜欢哪一个?为什么?

文章目录 每日一句正能量前言自己的喜好使用这种界面的原因这种界面对你的影响后记 每日一句正能量 不管昨天、今天、明天&#xff0c;能豁然开朗就是最美好的一天。 前言 个性化定制界面和极简版原装界面&#xff0c;哪一个你用起来更加顺手呢&#xff0c;相比之下你更喜欢哪一…

空洞卷积网络实现

代码&#xff1a; import torch.nn as nn import numpy as npfrom matplotlib import pyplot as plt import time #from utils import get_accur,load_data,trainimport torchvision from torchvision import transforms from torch.utils.data import DataLoader import torch…

硬编码基础一(经典定长指令,寄存器相关)

硬编码基础一&#xff08;定长指令&#xff09; push/pop 通用寄存器 50~57是push8个32位通用寄存器 58~5f是pop8个32位通用寄存器 inc/dec 通用寄存器 40~47是inc8个32位通用寄存器 47~4f是dec8个32位通用寄存器 八位通用寄存器的立即数赋值 b0~b3 {立即数} 是低八位(…

蓝蓝设计-专业UI设计公司-界面设计作品

数慧时空&#xff08;全称&#xff1a;北京数慧时空信息技术有限公司&#xff09;是以空间信息技术为核心、国内领先的国土资源行业解决方案提供商&#xff0c;具有业务咨询、自主软件研发、数据加工和信息服务的全业务综合服务能力&#xff0c;是国土资源部最重要的信息化合作…

AD19基础应用技巧(位号的调整)

在进行元件装配时&#xff0c;需要输出相应的装配文件&#xff0c;而元件的位号图可以方便比对元件装配。隐藏其他层&#xff0c;只显示Overlay和Solder层可以更方便地进行位号调整。 一般来说&#xff0c;位号大都放到相应元件旁边&#xff0c;其调整应遵循以下原则&#xff…

LLM低成本微调方法

LLM日益流行&#xff0c;已经渗透到各个领域&#xff0c;比如生物医学&#xff0c;但是模型的规模导致微调LLM对普通用户不够友好&#xff0c;因此&#xff0c;我们需要借助一些低成本方法&#xff0c;通过更新少量参数也达到与LLM全参数更新一样的效果。这里介绍三种主流方法&…

JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)

1.如何判断对象可以回收 1.1引用计数法 只要一个对象被其他对象所引用&#xff0c;就要让该对象的技术加1&#xff0c;某个对象不再引用其&#xff0c;则让它计数减1。当计数变为0时就可以作为垃圾被回收。 有一个弊端叫做循环引用&#xff0c;两个的引用计数都是1&#xff…

npm和node版本升级教程

cmd中查看本地安装的node版本 node -v //查询node的位置 where node2.官网下载所需要的node版本&#xff0c;安装在刚查出来的文件夹下&#xff0c;即覆盖掉原来的版本 3.查看node版本是否已经更新 4.查看npm版本是否和node版本相匹配 cnpm install -g npm

超实用的两款截图工具(FastStone Capture 和 Snipaste)

文章目录 一、概述1&#xff09;FastStone Capture2&#xff09;Snipaste 二、FastStone Capture 和 Snipaste 截图软件安装 一、概述 "FastStone Capture" 和 "Snipaste" 都是计算机上常用的截图工具&#xff0c;用于捕捉屏幕截图、编辑图像以及进行屏幕…

湘潭大学 湘大 XTU OJ 1217 A+B VII 题解(非常详细)

链接 1217 题目 题目描述 小明非常高兴你能帮他处理那些罗马数字&#xff0c;他想学着自己写罗马数字&#xff0c;但是他不知道自己到底写对了没有。 请你帮他写个程序&#xff0c;能正确地将10进制数字转换成罗马数字&#xff0c;以便他能进行核对。 罗马数字是使用字母组…

Docker运行Nacos容器,过一会就报错`UnsatisfiedDependencyException`

Docker运行Nacos容器&#xff0c;过一会就报错UnsatisfiedDependencyException 问题背景&#xff1a; 最近要上线一个项目&#xff0c;由于要使用Nacos作为服务注册中心&#xff0c;为了方便&#xff0c;我就打算直接使用Docker部署Nacos&#xff0c;没想到Nacos启动没一会就嗝…

三、Kafka生产者

目录 3.1 生产者消息发送流程3.1.1 发送原理 3.2 异步发送 API3.3 同步发送数据3.4 生产者分区3.4.1 kafka分区的好处3.4.2 生产者发送消息的分区策略3.4.3 自定义分区器 3.5 生产者如何提高吞吐量3.6 数据可靠性 3.1 生产者消息发送流程 3.1.1 发送原理 3.2 异步发送 API 3…

SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)2- 品目Code振替转记 和 在库转送

SAP 中在库移动 不仅有入库&#xff08;GR&#xff09;&#xff0c;出库&#xff08;GI&#xff09;&#xff0c;也可以是单纯内部的转记或转送。 1&#xff0c;振替转记&#xff08;转移过账&#xff09; 2&#xff0c;在库转送&#xff08;库存转储&#xff09; 1&#xff…

代码部署到服务器

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

阿里云无影云电脑/云桌面收费价格表_使用申请方法

阿里云无影云电脑配置具体收费价格表&#xff0c;4核8G企业办公型云电脑可以免费使用3个月&#xff0c;无影云电脑地域不同价格不同&#xff0c;无影云电脑费用是由云桌面配置、云盘、互联网访问带宽、AD Connector 、桌面组共用桌面session 等费用组成&#xff0c;阿里云百科分…

Linux驱动开发(Day5)

思维导图&#xff1a; 不同设备号文件绑定&#xff1a;

springboot sl4j2 写入日志到mysql

问题描述 springboot初始化的时候&#xff0c;会先初始化日志然后再加载数据源如果用配置文件进行初始化&#xff0c;那么会出现数据源没有加载成功&#xff0c;导致空指针异常 报错排查如下&#xff1a; 搜索报错信息&#xff0c;OBjects.invoke is Null打断点发现。dataso…