0

thanks for reading, I am working on a small memory card game in C# using Unity. When I run a certain scene I am receiving constant errors. The errors are as follows:

"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)"

My code is:

 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;
        }
    }
}

And:

 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
}

Any help anyone can offer would be greatly appreciated. Thank you in advance. Link to GitHub Repository

P.Boyle
  • 13
  • 3
  • The error suggests that `pairsManager` does not have a `Pairs` component attached to it at the time that it is trying to retrieve it in `SetUpArt()`. Alternatively, `pairsManager` may be null at the time, if `GameObject.FindGameObjectWithTag()` failed to retrieve it - debug to find out. – Serlite Apr 20 '17 at 21:53
  • Thank you, I am pretty new to Unity and am still learning. How do I attach the "Pairs" component to the pairsManager? – P.Boyle Apr 20 '17 at 22:12
  • You'll want to add an instance of `Pairs` using the Add Component button in the editor interface, probably. Though if your situation turns out to be more complex and you still cannot solve it, consider posting a new question. – Serlite Apr 21 '17 at 13:27

1 Answers1

0

I don't have knowledge about C#, as I'm working with java. You should initialize your variables. For more information I found this link What is a NullReferenceException, and how do I fix it?

Community
  • 1
  • 1