Unity-玻璃满时进入下一个层次

时间:2019-05-15 19:11:05

标签: c# unity3d 2d-games

当玻璃杯装满时,我试图使下一级可用。现在,仅当您单击“下一级”按钮时,下一级才会解锁,并且如果您重复该等级,则下一级将不会被解锁。

这是供参考的图片:

enter image description here

这是锁定级别的脚本:

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

[ExecuteInEditMode]
public class LockedLevels : MonoBehaviour {


    void Awake()
    {
        transform.GetChild(1).localScale = Vector3.one;
        PlayerPrefs.SetInt("1", 1);

        for (int i = 0; i < transform.GetChild(1).childCount; i++)
        {
            transform.GetChild(1).GetChild(i).gameObject.SetActive(false);
        }
        UnLockLevels();

    }
    void Update()
    {
        transform.GetChild(0).gameObject.GetComponent<Text>().text = transform.name;
        transform.GetChild(0).gameObject.GetComponent<Text>().fontSize = 75;
        if (Input.GetKeyDown(KeyCode.Delete))
        {
            PlayerPrefs.DeleteAll();
        }
    }

    public void UnLockLevels()
    {

        if (PlayerPrefs.GetInt(gameObject.name) == 1)
        {
            transform.GetChild(0).gameObject.GetComponent<Text>().color = new Color(1,1,1,1) ;
            GetComponent<Button>().interactable = true;
            if (PlayerPrefs.GetInt("Star" + gameObject.name) == 3)
            {
                for (int i = 0; i < transform.GetChild(1).childCount; i++)
                {
                    transform.GetChild(1).GetChild(i).gameObject.SetActive(true);
                }
            }
            else if (PlayerPrefs.GetInt("Star" + gameObject.name) == 2)
            {
                for (int i = 0; i < transform.GetChild(1).childCount-1; i++)
                {
                    transform.GetChild(1).GetChild(i).gameObject.SetActive(true);
                }
            }
            else if (PlayerPrefs.GetInt("Star" + gameObject.name) == 1)
            {
                transform.GetChild(1).GetChild(0).gameObject.SetActive(true);

            }
            else if (PlayerPrefs.GetInt("Star" + gameObject.name) == 0)
            {
                for (int i = 0; i < transform.GetChild(1).childCount; i++)
                {
                    transform.GetChild(1).GetChild(i).gameObject.SetActive(false);
                }
            }
        }
        else
        {
            GetComponent<Button>().interactable = false;
            transform.GetChild(0).gameObject.GetComponent<Text>().color = new Color(1, 1, 1, .5f);
        }
    }
    public void LevelMenu()
    {
        SceneManager.LoadScene(transform.name);
    }
}

这是glassFill脚本:

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

public class GlassFill : MonoBehaviour {

    int trigCont;
    GameManager gm;
    int Star;
    // Use this for initialization
    void Start () {
        gm = FindObjectOfType<GameManager>();
    }

    // Update is called once per frame
    void Update () {

    }
    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.tag == "DynamicParticle")
        {
            if (trigCont == 0)
            {
                transform.parent.GetChild(0).GetComponent<SpriteRenderer>().sprite = gm.SurpriseGlass;

            }
            col.gameObject.tag = "InGlassWater";
            col.gameObject.GetComponent<Rigidbody2D>().gravityScale = .3f;
            col.gameObject.GetComponent<Rigidbody2D>().velocity = col.gameObject.GetComponent<Rigidbody2D>().velocity /4;
            trigCont++;

            if (trigCont > 50)
            {
                if (trigCont == 51)
                {
                    if (Mathf.FloorToInt(gm.PenCapacity.value * 100) > 75)
                    {
                        Star = 3;
                    }
                    else if (Mathf.FloorToInt(gm.PenCapacity.value * 100) > 50)
                    {
                        Star = 2;
                    }
                    else if (Mathf.FloorToInt(gm.PenCapacity.value * 100) > 25)
                    {
                        Star = 1;
                    }
                    print(Star + "star");
                    transform.parent.GetChild(0).GetComponent<SpriteRenderer>().sprite = gm.HappyGlass;
                    Camera.main.GetComponent<AudioSource>().Play();
                    Invoke("nextScene", 2);
                    CancelInvoke("Check");
                    for (int i = 0; i < Camera.main.transform.childCount; i++)
                    {
                        if (Camera.main.transform.GetChild(i).GetComponent<ParticleSystem>() != null)
                        {
                            Camera.main.transform.GetChild(i).GetComponent<ParticleSystem>().Play();
                        }
                    }
                }               
            }
            else
            {
                CancelInvoke("Check");
                Invoke("Check",5);
            }
            if (trigCont > 60)
            {                                               //You can write  a function over here if you want to give a star according to glass fill
                print("two star");
            }           
            if (trigCont > 70)
            {
                print("three star");
            }
        }
    }
    void Check()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
    void nextScene()
    {
        PlayerPrefs.SetInt((SceneManager.GetActiveScene().buildIndex).ToString(), 1);
        PlayerPrefs.SetInt("Star" + SceneManager.GetActiveScene().name, Star);
        gm.LevComp.SetActive(true);
        if (Star > 2)
        {
            gm.LevComp.transform.GetChild(0).gameObject.SetActive(true);
            gm.LevComp.transform.GetChild(1).gameObject.SetActive(true);
            gm.LevComp.transform.GetChild(2).gameObject.SetActive(true);
        } 
        else if (Star > 1)
        {
            gm.LevComp.transform.GetChild(0).gameObject.SetActive(true);
            gm.LevComp.transform.GetChild(1).gameObject.SetActive(true);
        }
        else if (Star>0)
        {
            gm.LevComp.transform.GetChild(0).gameObject.SetActive(true);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

让我们假设您的场景中有一个空游戏对象,名为levelManagerGO,其中包含脚本LockedLevels。我相信需要调用的方法是masAlto = 1; raiz = Nuevo; 。因此,您应该在脚本GlassFill中创建对包含LockedLevels的空游戏对象的引用,以便可以调用int* masAlto

UnLockLevels()

https://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html

答案 1 :(得分:0)

检查玻璃杯是否已满的一种方法可能是制作玻璃杯的许多小的子对象。他们每个人都有一个对撞机。然后,如果全部或一定百分比的子对象与某种水接触。然后,您将知道玻璃杯已满,可以继续进行下一个级别。您可以每秒执行一次此检查。

只需列出每个子对象的列表,然后每秒大约检查一次它们的状态即可。