Unity-关卡完成后出现意外行为

时间:2019-05-24 10:30:15

标签: c# unity3d 2d-games

所以我制作了像Happy Glass这样的游戏,并且运行良好,但是有时候在关卡完成时,会出现进入下一个关卡的屏幕,然后立即消失,而您不能按下关卡

这里是图片供参考:

enter image description here

此屏幕出现并在不到一秒钟的时间内消失,因此您无法单击以转到下一个级别。

我有一个在特定时间调用下一个级别的函数,我试图更改时间但没有起作用。

终点线上附有以下代码(使您进入下一个级别的行):

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", 0);
                    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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

根据您的代码,我相信级别trigCont > 50一次完成,在那一刻,您将显示一个菜单,其中包含开始次数和按钮,以重复级别或移至下一个级别。 / p>

如果是这种情况,则应将Invoke("nextScene", 0);移至该条件的末尾。像

if (trigCont > 50)
{
    if (trigCont == 51)
    {
        //...          


        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();
            }
        }
        CancelInvoke("Check");
        Invoke("nextScene", 0);
    }               
}

此外,由于那应该是关卡的结尾,因此我将在void OnTriggerEnter2D(Collider2D col)的开头添加一个标志,以忽略场景中发生的任何其他情况。最好的办法是停止/禁用/销毁场景中的其他任何东西。但是我不知道您的场景中可能还有哪些其他元素在相互作用。因此,您可以这样做:

int trigCont;
GameManager gm;
int Star;
bool sceneIsOver = false;
...

还有内部的OnTriggerEnter2D:

void OnTriggerEnter2D(Collider2D col)
{
    if(!sceneIsOver)
        if (col.gameObject.tag == "DynamicParticle")
        {
            //...

            if (trigCont > 50)
            {
                if (trigCont == 51)
                {
                    //...

                    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();
                        }
                    }
                    CancelInvoke("Check");
                    sceneIsOver = true;
                    Invoke("nextScene", 0);
                }               
            }
            //...
        }
    }
}