c# - 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);
}
}
}
解决方案
根据您的代码,我相信该级别已完成一次 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);
}
}
//...
}
}
}
推荐阅读
- c# - 试图将 '' 转换为 "" 格式
- python - 熊猫数据框试图检索数据框中的整数
- r - geom_bar 中的排序值
- airflow - Airflow - xcom value acess into custom operator
- google-apps-script - 以编程方式打开打印预览对话框?
- algorithm - 结合 PRNG 和“真正的”随机、快速和(也许)愚蠢的方式
- python - 在 cursor.execute mysql 查询中传递元素列表
- ruby-on-rails - 我的 Ruby-on-Rails 应用程序中没有命令“rails test”
- amazon-web-services - AWS Cloudwatch 规则和胶水,具有独立的环境开发、质量保证、暂存和生产
- javascript - 在引导模式中获取新的完整日历事件