首页 > 解决方案 > Unity - 完成关卡时的意外行为

问题描述

所以我做了一个像快乐玻璃这样的游戏,它运行良好,但有时当关卡完成时,进入下一个关卡的屏幕出现然后立即消失,你无法按下下一个关卡

这是一张供参考的图片:

在此处输入图像描述

此屏幕会在几分之一秒内出现并消失,因此您无法单击以进入下一个级别。

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

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

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);
        }
    }
}

标签: c#unity3d2d-games

解决方案


根据您的代码,我相信该级别已完成一次 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);
                }               
            }
            //...
        }
    }
}

推荐阅读