Unity实战案例 2D小游戏HappyGlass(游戏管理类脚本)

news2024/12/27 11:17:52

本案例素材和教程都来自Siki学院,十分感谢教程中的老师

本文仅作学习笔记分享交流,不作任何商业用途

基础效果

游戏管理脚本

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
    public static GameManager gameManager;
    public LineRenderer lineRenderer;
    //控制鼠标抬起时不会画线
    private bool isDown;
    //优化相同点
    List<Vector2> points = new List<Vector2>();
    //铅笔对象
    public GameObject Pencil;
    //水龙头对象
    public GameObject Tap;
    //滑动条
    public Slider slider;
    //游戏内的星星
    public Image[] starts;
    //设置不可检测的层级
    public LayerMask wall;
    //设置胜利条件,和获取赢得界面的星星
    public int winWater;
    public GameObject[] winStars;
    //胜利界面
    public GameObject winPanel;
    //通过的星星数量
    public int starsCount;
    //失败时控制杯子的表情变化
    void Start()
    {
        gameManager = this;
        isDown = true;
        lineRenderer.positionCount = 0;//初始化点的个数
        slider.value = 1;
        starsCount = 3;
    }
    void Update()
    {
        DrawLine();
        UpMouse();
    }
    private void DrawLine()
    {
        if (slider.value == 0)
        {
            Pencil.SetActive(false);
        }
        if (Input.GetMouseButton(0) && isDown == true && slider.value > 0)
        {
            //屏幕坐标转世界坐标
            Vector2 MousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            //铅笔跟随鼠标
            Pencil.transform.position = MousePosition;
            Pencil.SetActive(true);

            //画线并优化点的位置
            if (!points.Contains(MousePosition))
            {
                //开启铅笔晃动脚本
                Pencil.GetComponent<Pencil>().enabled = true;

                lineRenderer.positionCount++;
                lineRenderer.SetPosition(lineRenderer.positionCount - 1, MousePosition);//画出点
                points.Add(MousePosition);
            }
            //为画出来的线添加碰撞体
            if (points.Count > 1)
            {
                //设置滑动条和星星减少的逻辑
                slider.value -= (MousePosition - points[lineRenderer.positionCount - 2]).magnitude / 20;
                if (slider.value < 0.75 && starts[2].enabled)
                {
                    starts[2].enabled = false;
                    starsCount--;
                }
                if (slider.value < 0.5 && starts[1].enabled)
                {
                    starts[1].enabled = false;
                     starsCount--;
                }
                if (slider.value < 0.25 && starts[0].enabled)
                {
                    starts[0].enabled = false;
                    starsCount--;
                }
                //获取两点位置
                Vector2 p1 = points[lineRenderer.positionCount - 2];
                Vector2 p2 = points[lineRenderer.positionCount - 1];

                //添加碰撞器
                GameObject gameObject = new GameObject("Collider");
                gameObject.transform.parent = lineRenderer.transform;
                gameObject.transform.localPosition = (p1 + p2) / 2;
                gameObject.AddComponent<BoxCollider2D>();
                //设置碰撞器的位置
                gameObject.GetComponent<BoxCollider2D>().size = new Vector2((p1 - p2).magnitude, lineRenderer.endWidth);
                gameObject.transform.right = (p1 - p2).normalized;
            }
        }
    }
    private void UpMouse()
    {
        //如果抬起鼠标
        if (Input.GetMouseButtonUp(0))
        {
            //铅笔隐藏
            Pencil.SetActive(false);
            Pencil.GetComponent<Pencil>().enabled = false;
            //水龙头触发
            Tap.GetComponent<AboutWater>().enabled = true;

            isDown = false;
            if (!lineRenderer.gameObject.GetComponent<Rigidbody2D>())
                lineRenderer.gameObject.AddComponent<Rigidbody2D>();

            StartCoroutine(Reset());
        }
      

    }
    //失败重置场景
    public IEnumerator Reset()
    {
    yield return new WaitForSeconds(10f);
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    
    }
    //获胜激活面板
    public IEnumerator Win()
    {
        //激活胜利panel
        winPanel.SetActive(true);
        for (int i = 0; i < starsCount; i++)
        {
            //激活星星数量
            yield return new WaitForSeconds(0.5f);
            winStars[i].SetActive(true);
        }     
   
    }
}

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

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

相关文章

FineBI修改地图配置

前言 在使用FineBI绘制地图时&#xff0c;有时候我们可能发现FineBI中的默认地图模型不是最新的&#xff0c;导致某些地区的区域地图与现实不一致&#xff0c;比如说FineBI的默认地图中深圳地图没有大鹏新区&#xff0c;并且将现在大鹏新区的地方标记为了龙华区&#xff0c;为…

Leetcode19删除链表的倒数第K个节点(java实现)

今天分享的题目如下&#xff1a; 说一下我们的解题思路&#xff1a;我们要想删除第k个节点&#xff0c;那么指针必须落在k-1节点上&#xff0c;比如我们想要操作题目中的节点4&#xff0c;那么指针必须落在节点3&#xff0c;然后让节点3.next 3.next.next即可。 所以明白了这个…

【精选】计算机毕业设计之:基于springboot汽车租赁系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

推荐3款免费的数据恢复软件,从此再也不怕数据丢失

Handy Recovery Handy Recovery是一款功能强大且易于使用的数据恢复软件&#xff0c;能够帮助用户恢复因误删、病毒攻击、系统崩溃等原因丢失的数据。该软件支持多种文件系统&#xff0c;包括FAT12/16/32、NTFS、NTFS5以及HFS等。它不仅可以从硬盘、闪存驱动器、U盘等设备中恢复…

Linux学习(13)计算机网络基础概论

本节学习内容 1.网络的基本概念&#xff08;网络、互联网、IP地址、MAC地址、常用网络协议&#xff09; 2.网络分层模型&#xff08;OS的7层模型与tcp/ip协议族体系4层结构、数据链路层、网络层、传输层、应用层&#xff09; 3.网络应用程序通信流程 一、网络的基本概念 1…

python可视化-直方图

1、加载数据 import pandas as pd from sklearn.datasets import load_iris import warnings# 禁用所有警告信息 warnings.filterwarnings(ignore)# 加载数据 iris load_iris() iris iris.keys() df pd.DataFrame(iris.data, columnsiris.feature_names) df[target] iris.t…

联华证券_股票特大单买入意味什么,主力入市

“股票特大单买入”通常意味着有大量资金集中在某一时刻涌入该股票&#xff0c;这往往被视为主力资金入市的迹象。以下是这一现象的详细解读&#xff1a; 1. 主力资金入市 特大单买入: 指的是单笔大额资金买入某只股票&#xff0c;通常是由机构投资者或其他大资金操盘者进行的…

动手学深度学习(pytorch)学习记录19-参数管理[学习记录]

文章目录 参数访问目标参数一次性访问所有参数从嵌套块收集参数 参数初始化内置初始化自定义初始化 参数绑定延后初始化 本节内容&#xff1a; 访问参数&#xff0c;用于调试、诊断和可视化&#xff1b; 参数初始化&#xff1b; 在不同模型组件间共享参数&#xff1b; 延后初始…

C++必修:unordered_set与unordered_map的实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. unordered_set与unordered_map的结构 我们知道STL中的unordered_set与unorder…

PowerDesigner生成数据库表结构

PowerDesigner生成数据库表结构 目录 1. 安装32位JDK 2. 更改当前DBMS 3. 下载MySQL驱动 4. 生成数据库表结构 安装32位JDK PowerDesigner只支持32位JDK 更改当前DBMS 下载MySQL驱动 下载地址&#xff1a; MySQL :: Begin Your Download 生成数据库表结构 选择Dire…

同城外卖系统开发方案解析

外卖系统开发是一个复杂而细致的过程&#xff0c;涉及多个方面的考虑和技术实现。以下是对外卖系统开发的详细解析&#xff1a; 一、需求分析 在开发外卖系统之前&#xff0c;首先需要进行详尽的需求分析。这包括用户需求、商家需求和后台管理需求三个方面&#xff1a; 用户需…

怎样把两个pdf合并成一个pdf?教你7种方法轻松完成合并!

新手小白如何将pdf合并成一个文件&#xff1f;pdf是目前较为主流的一种传输格式&#xff0c;内容包含了丰富的多媒体数据&#xff0c;包括文本、图像、表格等多种元素&#xff0c;很多企业和教育工作者都喜欢使用pdf格式。 pdf文件体积较小&#xff0c;兼容性高&#xff0c;平…

微深节能 卸料小车远程智能控制系统 格雷母线定位系统

微深节能的卸料小车远程智能控制系统与格雷母线定位系统的结合&#xff0c;为物料管理提供了智能化、精准化、高效化的解决方案。 一、系统概述 卸料小车远程智能控制系统&#xff1a;该系统利用现代科技手段&#xff0c;实现对卸料小车的远程监控与智能控制&#xff0c;旨在提…

使用vueuse在组件内复用模板

1. 安装vueusae pnpm i vueuse/core2. 组件内复用模板 createReusableTemplate 是vueuse中的一个实用工具&#xff0c;用于在 Vue 3 中创建可重复使用的模板片段&#xff0c;同时保持状态的独立性。这对于需要在多个组件中重复使用相同的结构和逻辑时非常有用。 因为这些可复…

基于ROM的VGA显示

前言 在早期计算机和嵌入式系统中&#xff0c;图形显示和用户界面的实现主要依赖于硬件技术。VGA&#xff08;视频图形阵列&#xff09;标准在1980年代中期成为主流图形显示技术&#xff0c;其高分辨率和良好的兼容性使其在计算机显示领域中占据了重要地位。VGA标准支持640x480…

基于清风数学建模视频课的思维导图

B站视频课地址 数学建模学习交流

【前端开发必备小技巧】前端代码规范html、css篇

文章目录 &#x1f7e2; 前端代码规范&#x1f7e2; 一、编码规约&#x1f449;1、命名规范&#x1f449;1.1、项目命名&#x1f449;1.2、目录命名&#x1f449;1.3、JS、CSS、SCSS、HTML、PNG 文件命名&#x1f449;1.4、命名严谨性 &#x1f449;2、HTML规范(Vue Template 同…

EasyCVR中的H.265技术:助力实现大规模高效流畅的视频监控应用

随着视频监控技术的不断发展和用户对视频质量要求的不断提高&#xff0c;高效能、低延迟的视频编码技术成为视频监控系统中的重要支撑。TSINGSEE青犀视频旗下的EasyCVR视频汇聚平台凭借其强大的视频处理能力和对H.265技术的支持&#xff0c;在视频监控系统中展现出显著的应用优…

【qt】锁

线程安全问题. 多线程程序太复杂了. 加锁 把多个线程要访问的公共资源&#xff0c;通过锁保护起来.>把并发执行变成串行执行. Linux mutex 互斥量. C11引入std::mutex Qt 同样也提供了对应的锁&#xff0c;来针对系统提供的锁进行封装.QMutex 多个线程进行加锁的对象&…

信息学奥赛初赛天天练-77-NOIP2015普及组-基础题2-二进制、连通图、最小生成树、链表、二叉树、完全二叉树

NOIP 2015 普及组 基础题2 4 在计算机内部用来传送、存贮、加工处理的数据或指令都是以( )形式进行的 A 二进制码 B 八进制码 C 十进制码 D 智能拼音码 5 下列说法正确的是( ) A CPU 的主要任务是执行数据运算和程序控制 B 存储器具有记忆能力&#xff0c;其中信息任何时候都…