由于未知的无限循环,Unity会不断崩溃?

时间:2017-04-26 10:08:02

标签: c# unity3d infinite-loop

所以我对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();
    }
}

}

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

本节的问题在于,如果所有卡都已初始化(初始化等于true),则测试变量将始终等于false。所以你最终会在while(!test)每次都是(true)的时候结束,导致无限循环。

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