2017-04-26 37 views
0

だから私はC#で非常にnoobyです。私は現在、メモリゲーム(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(); 
    } 
} 

} 

ありがとう!

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

このセクションの問題であることを、すべてのあなたのカードが初期化されている場合(その初期化される:

+3

このコードに無限ループを引き起こす可能性のあるものはありません。他のスクリプトを投稿する必要があります。あなたが投稿したものではない可能性があります。私は間違っているかもしれません... – Programmer

+3

あなたは間違いを犯したと思います。「私の問題は私のGameManagerスクリプトで知っています」_そしてあなたは 'Card'クラスを投稿しました。 –

+1

GameManagerスクリプトを共有できますか?動画のコメントにはhttps://pastebin.com/MMV5gkFsというものがありますが、あなたと同じものかどうかはわかりません。このような場合、checkCards()メソッドは無限ループになります。 'for(int i = 0; 1 buxter

答えて

0

私は何かがあなたのコード内の無限ループにつながる可能性があると思うだけで、コードの一部は以下のとおりです。 trueの場合)、テスト変数は常にfalseに等しくなります。だからあなたはwhile(真の)while(無限ループ)につながるwhile(!test)に終わるでしょう。

このセクションに入力しないようにする方法や、このような場合に終了する方法を追加してください。

+0

私はそれを仕上げました。それは、私が値を割り当てる部分に7の代わりに6を入れたからです。それは今働きます!助けてくれてありがとう –

+0

@AdamBeaumontこの設定は、組織のポイントから実際に見えて、(あなたの質問と修正によって証明されるように)失敗する傾向があります。カードのランダムな選択をしたい場合は、それを行うより良い方法があります。アレイの作成、シャッフル、上のN要素のポップ – Draco18s

+0

@ Drac018sええ、私は時間とプログラミング能力によって制限されているかもしれないと思った。それは私にパスを取得する限り!あなたの提案をありがとう –

関連する問題