Unity在Play上崩溃,很可能是无限循环,但无法定位问题

谢谢阅读。

我目前正在使用C#在Unity中构建一个小型存储卡游戏。 我已完成代码的主要部分,但是当我按某个场景上的播放按钮时,Unity会冻结。 我相信这是由于一个无限的While循环,但我找不到问题。 我真的很感激任何人都可以提供帮助。 我将在下面留下我的代码。 提前致谢。

using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using UnityEngine.SceneManagement; using UnityEngine; public class Pairs : MonoBehaviour { public Sprite[] face; //array of card faces public Sprite back; public GameObject[] deck; //array of deck public Text pairsCount; private bool deckSetUp = false; private int pairsLeft = 13; // Update is called once per frame void Update () { if (!deckSetUp) { SetUpDeck(); } if (Input.GetMouseButtonUp(0)) //detects left click { CheckDeck(); } }//Update void SetUpDeck() { for (int ix = 0; ix < 2; ix++) { for(int i = 1; i < 14; i++)//sets up card value (2-10 JQKA) { bool test = false; int val = 0; while (!test) { val = Random.Range(0, deck.Length); test = !(deck[val].GetComponent().SetUp); }//while //sets up cards deck[val].GetComponent().Number = i; deck[val].GetComponent().SetUp = true; }//nested for }//for foreach (GameObject crd in deck) { crd.GetComponent().setUpArt(); } if (!deckSetUp) { deckSetUp = true; } }//SetUpDeck public Sprite getBack() { return back; }//getBack public Sprite getFace(int i) { return face[i - 1]; }//getFace void CheckDeck() { List  crd = new List(); for(int i = 0; i < deck.Length; i++) { if(deck[i].GetComponent().State == 1) { crd.Add(i); } } if(crd.Count == 2) { CompareCards(crd); } }//CheckDeck void CompareCards(List crd) { Card.NO_TURN = true; //stops cards turning int x = 0; if(deck[crd[0]].GetComponent().Number == deck[crd[1]].GetComponent().Number) { x = 2; pairsLeft--; pairsCount.text = "PAIRS REMAINING: " + pairsLeft; if(pairsLeft == 0) // goes to home screen when game has been won { SceneManager.LoadScene("Home"); } } for(int j = 0; j < crd.Count; j++) { deck[crd[j]].GetComponent().State = x; deck[crd[j]].GetComponent().PairCheck(); } }//CompareCards } 

我相信问题在于while(!test),但我不知道为什么测试永远不会成为现实。

 using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using UnityEngine; public class Card : MonoBehaviour { public static bool NO_TURN = false; [SerializeField] private int cardState; //state of card [SerializeField] private int cardNumber; //Card value (1-13) [SerializeField] private bool _setUp = false; private Sprite back; //card back (Green square) private Sprite face; //card face (1-10 JQKA) private GameObject pairsManager; void Begin() { cardState = 1; //cards face down pairsManager = GameObject.FindGameObjectWithTag("PairsManager"); } public void setUpArt() { back = pairsManager.GetComponent().getBack(); face = pairsManager.GetComponent().getFace(cardNumber); turnCard();//turns the card } public void turnCard() //handles turning of card { if (cardState == 0) { cardState = 1; } else if(cardState == 1) { cardState = 0; } if (cardState == 0 && !NO_TURN) { GetComponent().sprite = back; // shows card back } else if (cardState == 1 && !NO_TURN) { GetComponent().sprite = face; // shows card front } } //setters and getters public int Number { get {return cardNumber;} set { cardNumber = value;} } public int State { get { return cardState; } set { cardState = value; } } public bool SetUp { get { return _setUp; } set { _setUp = value; } } public void PairCheck() { StartCoroutine(pause ()); } IEnumerator pause() { yield return new WaitForSeconds(1); if (cardState == 0) { GetComponent().sprite = back; } else if (cardState == 1) { GetComponent().sprite = face; } } } 

感谢您阅读,如果有帮助,我会发布一个指向github存储库的链接。 github存储库

您的deck数组中至少有一张卡,其中_setUp设置为true ,这将使其进入无限循环。

它进入无限循环的原因是因为它将所有可用的_setUp设置为true ,并且它将继续寻找设置为false _setUp并且它永远不会找到任何。

你需要至少26个_setUpfalse对象的原因是因为在嵌套for循环中你循环13次然后你做两次这总共26个循环。 所以你需要至少26个对象。

你可以做些什么来确保它们都是false是在进入for循环之前将它们全部设置为false

 for(int i = 0; i < deck.Length; i++) { deck[i].GetComponent().SetUp = false; }