编程语言
首页 > 编程语言> > c# – Unity在Play上崩溃,很可能是无限循环,但找不到问题

c# – 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<Card>().SetUp);
                }//while

                //sets up cards

                deck[val].GetComponent<Card>().Number = i;
                deck[val].GetComponent<Card>().SetUp = true;

            }//nested for

        }//for

        foreach (GameObject crd in deck)
        {
            crd.GetComponent<Card>().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 < int > crd = new List<int>();

        for(int i = 0; i < deck.Length; i++)
        {
            if(deck[i].GetComponent<Card>().State == 1)
            {
                crd.Add(i);
            }

        }

        if(crd.Count == 2)
        {
            CompareCards(crd);
        }
    }//CheckDeck

    void CompareCards(List<int> crd)
    {
        Card.NO_TURN = true; //stops cards turning

        int x = 0;

        if(deck[crd[0]].GetComponent<Card>().Number == 
  deck[crd[1]].GetComponent<Card>().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<Card>().State = x;
            deck[crd[j]].GetComponent<Card>().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<Pairs>().getBack();
        face = pairsManager.GetComponent<Pairs>().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<Image>().sprite = back; // shows card back
        }
        else if (cardState == 1 && !NO_TURN)
        {
            GetComponent<Image>().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<Image>().sprite = back;
        }
        else if (cardState == 1)
        {
            GetComponent<Image>().sprite = face;
        }
    }
}

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

解决方法:

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

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

你需要至少26个具有_setUp为false的对象的原因是因为在嵌套的for循环中你循环13次然后你做了两次,总共有26个循环.所以你需要至少26个对象.

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

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

标签:android,unity3d,visual-studio-2017,c-2
来源: https://codeday.me/bug/20191007/1866735.html