Unity 在播放时崩溃,很可能是无限的 While 循环,但找不到问题

Unity Crashing on Play, most likely infinite While loop, but cannot locate issue(Unity 在播放时崩溃,很可能是无限的 While 循环,但找不到问题)
本文介绍了Unity 在播放时崩溃,很可能是无限的 While 循环,但找不到问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

感谢阅读.

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

I'm currently building a small memory card game in Unity using C#. I have the main portion of code finished but when I press the play button on a certain scene Unity freezes. I believe it is due to an infinite While loop, but I can not find the issue. I would really appreciate any help anyone can offer. I will leave my code below. Thanks in advance.

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) 但我不知道为什么 test 永远不会成为真的.

I believe the issue lies in the while(!test) but i do not know why test never become true.

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 存储库

Thank you for reading, I will post a link to the github repository if that helps. github repository

推荐答案

你的套牌数组中至少有一张卡片,其中 _setUp 设置为 true 这将使它进入一个无限循环.

Your deck array has at least one card in it that has _setUp set to true which would make it go in a infinite loop.

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

The reason it goes in a infinite loop is because it will have set all available _setUp to true and it would keep looking for _setUp that are set to false and it will never find any.

您需要至少 26 个具有 _setUpfalse 的对象的原因是因为在嵌套的 for 循环中,您循环了 13 次,然后您执行了两次,这给出了总共26个循环.所以你至少需要 26 个对象.

The reason you need at least 26 object that have _setUp to false is because in the nested for loop you loop 13 times and then you do that twice which gives a total of 26 loops. So you need at least 26 objects.

为了确保它们都是false,你可以做的是在进入for循环之前将它们全部设置为false

What you can do to make sure that they're all false is to set them all to false before entering the for loop

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

这篇关于Unity 在播放时崩溃,很可能是无限的 While 循环,但找不到问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)