【问题标题】:Unity keeps crashing due to unknown infinite loop? [duplicate]由于未知的无限循环,Unity不断崩溃? [复制]
【发布时间】:2017-04-26 10:08:02
【问题描述】:

所以我非常不喜欢 C#。我目前正在学习制作记忆游戏的教程 (https://www.youtube.com/watch?v=prfzIpNhQMM)。

我已经全部遵循并设法解决了我到目前为止遇到的所有问题;每次我单击播放时,Unity 都会冻结。视频中有一些与创作者有相同问题的人说这可能是由于代码中的无限循环。我没有足够的知识来识别其中之一。

我知道问题出在我的 GameManager 脚本上。如果有人可以查看一下,看看他们是否能找到我的问题,我将不胜感激:

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

public class GameManager : MonoBehaviour {

public Sprite[] cardFace;
public Sprite cardBack;
public GameObject[] cards;
public Text matchText;

private bool _init = false;
private int _matches = 6;  


// Update is called once per frame
void Update () {
    if (!_init)
        initializeCards ();
    if (Input.GetMouseButtonUp(0))
        checkCards();
}

void initializeCards()
{
    for(int id = 0; id < 2; id++)
    {
        for(int i = 1; i < 6; i++)
        {
            bool test = false;
            int choice = 0;
            while (!test) {
                choice = Random.Range(0, cards.Length);
                test = !(cards[choice].GetComponent<Card>().initialized);
            }
            cards[choice].GetComponent<Card>().cardValue = i;
            cards[choice].GetComponent<Card>().initialized = true;
        }
    }

    foreach (GameObject c in cards)
        c.GetComponent<Card>().setupGraphics();

    if (!_init)
        _init = true;

    }

public Sprite getCardBack()
{
    return cardBack;
}

public Sprite getCardFace(int i)
{
    return cardFace[i - 1];
}

void checkCards()
{
    List<int> c = new List<int>();

    for(int i = 0; i < cards.Length; i++)
    {
        if (cards[i].GetComponent<Card>().state == 1)
            c.Add(i);
    }


    if (c.Count == 2)
        cardComparison(c);



}

void cardComparison(List<int> c)
{
    Card.DO_NOT = true;
    int x = 0;
    if(cards[c[0]].GetComponent<Card>().cardValue == cards[c[1]].GetComponent<Card> ().cardValue)
    {
        x = 2;
        _matches--;
        matchText.text = "Number of Matches: " + _matches;
        if (_matches == 0)
            SceneManager.LoadScene("VirusInfo3");
    }

    for(int i = 0; i < c.Count; i++)
    {

        cards[c[i]].GetComponent<Card>().state = x;
        cards[c[i]].GetComponent<Card>().falseCheck();
    }
}

}

谢谢!

【问题讨论】:

  • 我在这段代码中看不到任何可能导致无限循环的东西。您必须发布其他脚本。它可能不是来自您发布的这个。我可能错了……
  • 我认为你犯了错误“我知道问题出在我的 GameManager 脚本上”并且你已经发布了 Card 类。
  • 你能分享你的 GameManager 脚本吗?视频下方的 cmets 有一个:pastebin.com/MMV5gkFs,但我不确定它是否与您的相同。如果是这种情况,则 checkCards() 方法有一个无限循环:` for (int i = 0; 1
  • 哇,我是个大白痴,不知道我是怎么把它们混在一起的。现在已经用实际代码编辑了原始问题。是的@buxter 我看到了那个评论并检查了我自己的,但它似乎没问题。当我删除它时,它对 GameManager 脚本进行了删除,Unity 工作正常。

标签: c# unity3d infinite-loop


【解决方案1】:

我认为可能导致代码中出现无限循环的唯一代码部分如下:

while (!test) {
    choice = Random.Range(0, cards.Length);
    test = !(cards[choice].GetComponent<Card>().initialized);
}

这个部分的问题是,如果你所有的卡片都被初始化了(所以初始化等于 true),你的测试变量总是等于 false。所以你最终会得到 while(!test) 每次都是 while(true) ,导致无限循环。

如果发生这种情况,添加一种不进入此 while 部分或退出它的方法,您应该完成。

【讨论】:

  • 我解决了。这是因为我在它分配值的部分中放置了 6 而不是 7。现在可以了!感谢您的帮助
  • @AdamBeaumont 正如您所知,从组织的角度来看,此配置看起来非常粗略并且容易失败(正如您的问题和修复所证明的那样)。如果您想要随机选择卡片,有更好的方法来做到这一点。比如...创建一个数组,对其进行洗牌,然后弹出前 N 个元素。
  • @Drac018s 是的,我认为可能会有,但是我受到时间和编程能力的限制。只要它能让我通过!感谢您的建议
猜你喜欢
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
相关资源
最近更新 更多