Unity - неожиданное поведение, когда уровень закончен - PullRequest
0 голосов
/ 24 мая 2019

Итак, я создал игру наподобие 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 Ответ

1 голос
/ 24 мая 2019

Согласно вашему коду, уровень завершается один раз trigCont > 50, и в этот момент вы отображаете меню с количеством запусков и кнопками для повторения уровня или перехода к следующему.

Если это так, вы должны переместить 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);
                }               
            }
            //...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...