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

C# Unity中的问题,NullReferenceException:对象引用未设置为对象的实例,c#,unity3d,visual-studio-2017,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 ()

感谢阅读,我正在使用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;
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine.UI;
使用UnityEngine;
公共类卡:单行为{
公共静态bool NO_TURN=false;
[序列化字段]
private int cardState;//卡的状态
[序列化字段]
私有int cardNumber;//卡值(1-13)
[序列化字段]
私有布尔设置=假;
private Sprite cBack;//卡片背面(绿色方形)
private Sprite cFace;//卡面(1-10 JQKA)
私人游戏对象配对管理器;
void Begin()
{
cardState=1;//卡正面朝下
pairsManager=GameObject.FindGameObjectWithTag(“pairsManager”);
}
公共艺术
{

cBack=pairsManager.GetComponent().GetBack()/我不了解C,因为我正在使用java。您应该初始化变量。有关更多信息,我发现此链接

错误表明,
pairsManager
SetUpArt()中尝试检索时,没有连接到它的
Pairs
组件
。或者,如果
GameObject.FindGameObjectWithTag()
检索失败,那么,
pairsManager
当时可能为空。请调试查找。谢谢,我对Unity还很陌生,还在学习中。我如何附加“配对”组件可能会使用编辑器界面中的“添加组件”按钮来添加“<代码>配对/<代码>的实例。如果您的情况变得更加复杂,您仍然无法解决它,请考虑发布一个新问题。
 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
}