当前位置: 首页 > article >正文

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

本案例素材和教程都来自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.kler.cn/news/289251.html

相关文章:

  • git进阶·团队开发的时候为何要创建临时分支来修复bug
  • 2708. 一个小组的最大实力值(24.9.3)
  • ADB 获取屏幕坐标,并模拟滑动和点击屏幕
  • 深入理解 JavaScript DOM 操作
  • js处理echarts tooltip定时轮播
  • 一款基于Vue的低代码可视化表单设计器工具,6K star的可视化表单设计器工具,轻松搞定表单,支持多端适配(附源码)
  • 被低估的SQL
  • 基于vue框架的超市管理系统ki6i8(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 责任链设计模式详解
  • B端系统门门清之:SCRM系统,为客户管理加上社交,如虎添翼
  • MySQL事务处理(TransAction)
  • 苹果11月推出新款M4 Mac:Mac mini设计焕新 MacBook Pro仅例行更新
  • wsl下将Ubuntu从c盘移动到其他盘
  • Linux——IO模型_多路转接(epoll)
  • 监控平台之针对vue,react上报
  • ​yum安装/更新时报错:SyntaxError: invalid syntax​
  • 全局网络代理的使用与选择
  • css的position定位的属性
  • 【Java那些事】关于Git的使用
  • Datawhale X 李宏毅苹果书 AI夏令营|机器学习基础之案例学习
  • Vue -- 总结 02
  • adb大全指令(持续更新)
  • 动态住宅IP代理的搭建指南:实现高效网络访问
  • 数据访问:JPA关联MyBatis
  • Elasticsearch的Restful风格API
  • 达梦常用SQL及脚本工具
  • 哈希 详解
  • echart自适应tree树图,结构组织图模板
  • 国赛数模C题模型(五)
  • 将泛型和函数式编程结合,竟然会让代码这么优雅!