unity3d Unity2D:我示例化随机对象仍然是错误的,即使我附加了一个脚本到它

sirbozc5  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(119)

我目前正在为我的项目做一个简单的游戏,这个游戏会产生食物并破坏它直到它消失。我必须写一个脚本,从数组中示例化一个随机对象,将脚本附加到它,并在另一个脚本中破坏示例化的食物。现在的问题是Unity告诉我,我在两个脚本中都有一个空引用异常。我试图通过将脚本附加到示例化对象来修复它,但问题仍然存在。
下面是附加到示例化对象的脚本上的代码,同时也生成该对象:`

public class Food : MonoBehaviour
{
    public GameObject[] food;
    public Vector3Int spawnPosition;
    public int health = 200;
    public int currentHealth;

    private GameObject clone;

    public void Start()
    {
        currentHealth = health;
        SpawnFood();
    }

    //Spawning food 
    public void SpawnFood()
    {
        int random = Random.Range(0, food.Length); //Null Reference Exception happen in this line.
        clone = Instantiate(food[random], this.spawnPosition, Quaternion.identity) as GameObject;

        clone.AddComponent<Food>();
    }

    public void TakeDamage(int damage)
    {
        currentHealth -= damage;

        //play hurt effect

        if(currentHealth < 0)
        {
            Vanish();
        }
    }

    void Vanish()
    {
        Debug.Log("Vanished");
    }
}

下面是另一个脚本:

public class Board : MonoBehaviour
{
    public Tilemap tilemap { get; private set; }
    public Piece activePiece { get; private set; }
    public TetrominoData[] tetrominoes;
    public Vector3Int spawnPosition;
    public Vector2Int boardSize = new Vector2Int(10, 20);
    public int damage;

    public Food clone;

    public TextMeshProUGUI hud_score;

    public static int currentScore = 0;

    public int scoreOneLine = 40;
    public int scoreTwoLine = 100;
    public int scoreThreeLine = 300;
    public int scoreFourLine = 1200;

    private int numberOfRowsThisTurn = 0;

    public RectInt Bounds
    {
        get
        {
            Vector2Int position = new Vector2Int(-this.boardSize.x / 2, -this.boardSize.y / 2);
            return new RectInt(position, this.boardSize);
        }
    }

    private void Awake()
    {
        this.tilemap = GetComponentInChildren<Tilemap>();
        this.activePiece = GetComponentInChildren<Piece>();

        //call Tetromino.Initialize() to spawn pieces
        for (int i = 0; i < this.tetrominoes.Length; i++)
        {
            this.tetrominoes[i].Initialize();
        }
    }
        
    private void Start()
    {
        SpawnPiece();
    }

    private void Update()
    {
        UpdateScore();
        UpdateUI();
    }

    public void UpdateUI()
    {
        hud_score.text = currentScore.ToString();
    }

    public void UpdateScore()
    {
        if(numberOfRowsThisTurn > 0)
        {
            if(numberOfRowsThisTurn == 1)
            {
                ClearedOneLine();
            } 
            else if (numberOfRowsThisTurn == 2)
            {
                ClearedTwoLine();
            } 
            else if (numberOfRowsThisTurn == 3)
            {
                ClearedThreeLine();
            } 
            else if (numberOfRowsThisTurn == 4)
            {
                ClearedFourLine();
            }

            numberOfRowsThisTurn = 0;
        }
    }

    public void ClearedOneLine()
    {
        currentScore += scoreOneLine;

        clone.GetComponent<Food>().TakeDamage(10); //Null Reference Exception happen in this line.
    }

    public void ClearedTwoLine()
    {
        currentScore += scoreTwoLine;

        clone.GetComponent<Food>().TakeDamage(20); //Null Reference Exception happen in this line.
    }

    public void ClearedThreeLine()
    {
        currentScore += scoreThreeLine;

        clone.GetComponent<Food>().TakeDamage(40); //Null Reference Exception happen in this line.
    }

    public void ClearedFourLine()
    {
        currentScore += scoreFourLine;

        clone.GetComponent<Food>().TakeDamage(80); //Null Reference Exception happen in this line.
    }

`
请帮忙,谢谢你的帮助。
以下是数组中包含64个元素的检查器图像:

我已经尝试在生成示例化对象时将脚本附加到该对象。

vhipe2zx

vhipe2zx1#

我在任何地方都没有看到 food 集。你需要从Inspector中填充Food中的数组,或者至少在使用Food.Start()之前,在Food.Start()中编程填充。
你还能给我们看一个Inspector视图的printscr吗?在这个视图中,Food是作为组件附加的。

ljo96ir5

ljo96ir52#

food数组是空的它应该由你来填充,instantiate不填充它,它从数组中获取一个对象并繁殖它。用已经有food组件的foods的prefabs填充它,不需要在代码中添加它

相关问题