Ошибка NullReferenceException: Object reference not set to an instance of an object Game.UpdateUI [дубликат]

321
19 декабря 2021, 18:10
На этот вопрос уже даны ответы здесь:
Что такое NullReferenceException, и как мне исправить код? (2 ответа)
Закрыт 2 года назад.

Ошибка NullReferenceException: Object reference not set to an instance of an object Game.UpdateUI () (at Assets/Scripts/Game.cs:40) Game.Update () (at Assets/Scripts/Game.cs:34)

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class Game : MonoBehaviour
{
    public static int gridWidth = 10;
    public static int gridHeight = 20;
    public static Transform[,] grid = new Transform[gridWidth,gridHeight];
    public int scoreOneLine = 40;
    public int scoreTwoLine = 100;
    public int scoreThreeLine = 300;
    public int scoreFourLine = 1200;
    public Text hud_score;
    private int numberOfRowsThisTurn = 0;
    private int currentScore = 0;
    // Start is called before the first frame update
    void Start()
    {
        SpawnNextTetromino ();
    }
    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) {
                ClearedTwoLines ();
            } else if (numberOfRowsThisTurn == 3) {
                ClearedThreeLines ();
            } else if (numberOfRowsThisTurn == 4) {
                ClearedFourLines ();
            }
            numberOfRowsThisTurn = 0;
        }
    }
    public void ClearedOneLine () {
        currentScore += scoreOneLine;
    }
    public void ClearedTwoLines () {
        currentScore += scoreTwoLine;
    }
    public void ClearedThreeLines () {
        currentScore += scoreThreeLine;
    }
    public void ClearedFourLines () {
        currentScore += scoreFourLine;
    }
    public bool CheckIsAboveGrid (tetrismino tetromino) {
        for (int x = 0; x < gridWidth; ++x) {
            foreach (Transform mino in tetromino.transform) {
                Vector2 pos = Round (mino.position);
                if (pos.y > gridHeight -1) {
                    return true;
                }
            }
        }
        return false;
    }
    public bool IsFullRowAt (int y) {
        for (int x = 0; x < gridWidth; ++x) {
            if (grid[x, y] == null) {
                return false;
            }
        }
        numberOfRowsThisTurn++;
        return true;
    }
    public void DeleteMinoAt (int y) {
        for (int x = 0; x < gridWidth; ++x) {
            Destroy (grid[x, y].gameObject);
            grid[x, y] = null;
        }  
    }
    public void MoveRowDown (int y) {
        for (int x = 0; x < gridWidth; ++x) {
            if (grid[x, y] != null) {
                grid[x, y-1] = grid[x, y];
                grid[x, y] = null;
                grid[x, y-1].position += new Vector3(0, -1, 0); 
            }
        }
    }
    public void MoveAllRowDown (int y) {
        for (int i = y; i < gridHeight; ++i) {
            MoveRowDown (i);
        }
    }
    public void DeleteRow () {
        for (int y = 0; y < gridHeight; ++y) {
            if (IsFullRowAt(y)) {
                DeleteMinoAt(y);
                MoveAllRowDown(y + 1);
                --y;
            }
        }
    }
    public void UpdateGrid (tetrismino tetromino) {
        for (int y = 0; y < gridHeight; ++y) {
            for (int x = 0; x < gridWidth; ++x) {
                if (grid[x, y] != null) {
                    if (grid[x,y].parent == tetromino.transform) {
                        grid[x, y] = null;
                    }
                }
            }
        }
        foreach (Transform mino in tetromino.transform) {
            Vector2 pos = Round (mino.position);
            if (pos.y < gridHeight) {
                grid[(int)pos.x, (int)pos.y] = mino;
            }
        }
    }
    public Transform GetTransformGridPosition (Vector2 pos) {
        if (pos.y > gridHeight -1) {
            return null;
        } else {
            return grid[(int)pos.x, (int)pos.y];
        }
    }
    public void SpawnNextTetromino () {
        GameObject nextTetromino = (GameObject)Instantiate(Resources.Load(GetRandomTetromino(), typeof(GameObject)), new Vector2(5.0f, 20.0f), Quaternion.identity);
    }
    public bool  CheckIsInsideGrid (Vector2 pos) {
        return ((int)pos.x >= 0 && (int)pos.x < gridWidth && (int)pos.y >= 0);
    }
    public Vector2 Round (Vector2 pos) {
        return new Vector2 (Mathf.Round(pos.x), Mathf.Round(pos.y));
    }
    string GetRandomTetromino () {
        int randomTetromino = Random.Range(1, 8);
        string randomTetrominoName = "Prefabs/Tetromino_T";
        switch (randomTetromino) {
        case 1:
            randomTetrominoName = "Prefabs/Tetromino_T";
            break;
        case 2:
            randomTetrominoName = "Prefabs/Tetromino_I";
            break;
        case 3:
            randomTetrominoName = "Prefabs/Tetromino_O";
            break;
        case 4:
            randomTetrominoName = "Prefabs/Tetromino_J";
            break;
        case 5:
            randomTetrominoName = "Prefabs/Tetromino_L";
            break;
        case 6:
            randomTetrominoName = "Prefabs/Tetromino_S";
            break;
        case 7:
            randomTetrominoName = "Prefabs/Tetromino_Z";
            break;
        }
        return randomTetrominoName;
    }
    public void GameOver () {
        SceneManager.LoadScene ("GameOver");
    }
}
Answer 1

Причина возникновения ошибки NullReferenceException это отсутствие объекта в: Text hud_score;

Решение: Обратите внимание на public Text hud_score; его инициализация производиться в Unity, просто вернитесь в Unity и укажите в используемом коде hud_score объект с помощью перетаскивания или выбором объекта Text с текущей сцены.

Либо вы можете изначально прописать используемый объект в коде: public Text hud_score = GameObject.Find("Тут_имя_объекта_выводящего_текст").GetComponent<Text>();

READ ALSO
Подсчёт символов в строке C#

Подсчёт символов в строке C#

Подсчитывается относительная частота встречаемости каждого символа в текстеК примеру в textBox1 записывается "A B"

136
как запрограммировать ListBox на мультистрочность?

как запрограммировать ListBox на мультистрочность?

Использую WinForms наNet Compact Framework для Windows Mobile devices

312
Можно в terrain.terrainData.treeInstances поместить не деревья?

Можно в terrain.terrainData.treeInstances поместить не деревья?

Мне надо создать кисть в которой будут камни, столбы, кусты и прочие элементы окружающей средыЯ купил кисть Prefab Brush

95
Таблица Шульте. Нужно довести до ума

Таблица Шульте. Нужно довести до ума

Таблица Шульте - таблица случайно расположенных чисел, обычно размером 5x5 элементов и обычно состоит из цифр и буквПример: https://cepia

231