Unity中的问题,NullReferenceException:未将对象引用设置为对象的实例

时间:2017-04-20 21:52:03

标签: c# unity3d visual-studio-2017

感谢您的阅读,我正在使用Unity在C#中进行小型存储卡游戏。当我运行某个场景时,我会收到不断的错误。 错误如下:

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

我的代码是:

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

 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
}

任何人都可以提供任何帮助将不胜感激。先感谢您。 Link to GitHub Repository

1 个答案:

答案 0 :(得分:0)

我对C#一无所知,因为我正在使用java。您应该初始化变量。有关详细信息,我发现此链接What is a NullReferenceException, and how do I fix it?