2017-04-26 31 views
0

所以我很讨厌C#。我目前正在接受一个教程来制作一个记忆游戏(https://www.youtube.com/watch?v=prfzIpNhQMM)。由于未知的无限循环,Unity不断崩溃?

我已经全部跟踪并设法解决了我遇到的所有问题,直到现在;每次我点击游戏时,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(); 
    } 
} 

} 

谢谢!

+3

我没有看到任何可能导致此代码中的无限循环的东西。你必须发布其他脚本。这可能不是你发布的这个。我可能是错的... – Programmer

+3

我认为你犯了一个错误_“我知道问题出在我的GameManager脚本上,而你已经发布了'Card'类。 –

+1

你能分享你的GameManager脚本吗?视频下的评论有一个:https://pastebin.com/MMV5gkFs,但我不确定它是否与您的相同。如果是这种情况,那么checkCards()方法会有一个无限循环:'for(int i = 0; 1 buxter

回答

0

唯一代码的一部分,我认为有些事情可能会导致在你的代码无限循环如下:

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

这部分的问题是,如果所有的牌都被初始化(所以初始化幸福等于true),你的测试变量总是等于false。所以你最终会在while(!test)while(true)的时候结束,导致无限循环。

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

+0

我解决了它。这是因为我在它赋值的部分放了6而不是7。它现在有效!感谢您的帮助 –

+0

@AdamBeaumont就这样,您知道,从组织角度来看,这种配置看起来非常粗略,并且容易失败(您的问题和解决方法就是证明)。如果你想随机选择一张卡片,那么有更好的方法来完成它。像...创建一个数组,洗牌,并弹出前N个元素。 – Draco18s

+0

@ Drac018s是的,我认为可能会有,但我受时间和编程能力的限制。只要它让我通过!感谢您的建议 –