本案例素材和教程都来自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);
        }     
   
    }
}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部