2017-04-20 4 views
0

Danke fürs Lesen, ich arbeite an einem kleinen Speicherkartenspiel in C# mit Unity. Wenn ich eine bestimmte Szene starte, erhalte ich konstante Fehler. Die Fehler sind wie folgt:Problem in Unity, NullReferenceException: Objektreferenz nicht auf eine Instanz eines Objekts eingestellt

"NullReferenceException: Object reference not set to an instance of an object 
Card.SetUpArt() (at Assets/Scripts/Card.cs:31) 
Pairs.SetUpDeck() (at Assets/Scripts/Pairs.cs:62) 
Pairs.Update() (at Assets/Scripts/Pairs.cs:23)" 

Mein Code ist:

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 cBack; //card back (Green square) 
    private Sprite cFace; //card face (1-10 JQKA) 

    private GameObject pairsManager; 

    void Begin() 
    { 
     cardState = 1; //cards face down 
     pairsManager = GameObject.FindGameObjectWithTag("PairsManager"); 

    } 

    public void SetUpArt() 
    { 
     cBack = pairsManager.GetComponent<Pairs>().GetBack(); //<--error 
     cFace = 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 = cBack; // shows card back 
     } 
     else if (cardState == 1 && !NO_TURN) 
     { 
      GetComponent<Image>().sprite = cFace; // 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 = cBack; 
     } 
     else if (cardState == 1) 
     { 
      GetComponent<Image>().sprite = cFace; 
     } 
    } 
} 

Und:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine.UI; 
using UnityEngine.SceneManagement; 
using UnityEngine; 

public class Pairs : MonoBehaviour { 

    public Sprite[] cardFace; //array of card faces 
    public Sprite cardBack; 
    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 i = 0; i <deck.Length; i++)//resets cards 
     { 
      deck[i].GetComponent<Card>().SetUp = false; 
     } 

     for (int ix = 0; ix < 2; ix++) //sets up cards twice, 
     { 
      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 cardBack; 
    }//getBack 

    public Sprite GetFace(int i) 
    { 
     return cardFace[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 
} 

Jede jemand helfen kann wäre sehr dankbar bieten. Vielen Dank im Voraus. Link to GitHub Repository

+0

Der Fehler schlägt vor, dass 'pairsManager' nicht eine' Pairs'-Komponente an sie angeschlossen hat, als es versucht, es in 'SetUpArt()' abzurufen. Alternativ kann 'pairsManager' zu der Zeit null sein, wenn' GameObject.FindGameObjectWithTag() 'nicht gefunden werden konnte - debug, um es herauszufinden. – Serlite

+0

Danke, ich bin ziemlich neu in Unity und lerne immer noch. Wie hänge ich die "Pairs" -Komponente an den pairsManager an? –

+0

Sie sollten wahrscheinlich eine Instanz von 'Pairs' über die Schaltfläche Komponente hinzufügen in der Editor-Oberfläche hinzufügen. Wenn sich Ihre Situation jedoch als komplexer herausstellt und Sie es immer noch nicht lösen können, sollten Sie eine neue Frage stellen. – Serlite

Antwort

Verwandte Themen