Пожалуйста, помогите мне с моей ошибкой; NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта

Привет, ребята, я уже 3 дня борюсь, пытаясь исправить эту ошибку в моем коде; NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта Parallaxerr.Shift () (в Assets / scripts / Parallaxerr.cs: 134) Parallaxerr.Update () (в Assets / scripts / Parallaxerr.cs: 82)

Это мой код

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Parallaxerr : MonoBehaviour
{

    class PoolObject
    {
        public Transform transform;
        public bool inUse;
        public PoolObject(Transform t) { transform = t; }
        public void Use() { inUse = true; }
        public void Dispose() { inUse = false; }

    }

    [System.Serializable]
    public struct YSpawnRange
    {
        public float min;
        public float max;
    }

    public GameObject Prefab;
    public int poolSize;
    public float shiftSpeed;
    public float spawnRate;


    public YSpawnRange ySpawnRange;
    public Vector3 defaultSpawnPos;
    public bool spawnImmediate;//particle prewarm
    public Vector3 immediateSpawnPos;
    public Vector2 targetAspectRatio;

    float spawnTimer;
    float targetAspect;
    PoolObject[] poolObjects; //step 1 ; variable declared 
    GameManager game;

    void Awake()
    {

    }

    void Start()
    {
        game = GameManager.Instance;
    }

    void OnEnable()
    {
        GameManager.OnGameOverConfirmed += OnGameOverConfirmed;
    }

    void OnDisable()
    {
        GameManager.OnGameOverConfirmed += OnGameOverConfirmed;
    }

    void OnGameOverConfirmed()
    {
        for (int i = 0; i < poolObjects.Length; i++)
        {
            poolObjects[i].Dispose();
            poolObjects[i].transform.position = Vector3.one * 1000;
        }

        if (spawnImmediate)
        {
            SpawnImmediate();
        }
    }


    void Update()
    {
        if (game.GameOver) return;

        Shift();
        spawnTimer += Time.deltaTime;
        if (spawnTimer > spawnRate)
        {
            Spawn();
            spawnTimer = 0;
        }
    }

    void Configure()
    {
        targetAspect = targetAspectRatio.x / targetAspectRatio.y;
        poolObjects = new PoolObject[poolSize];
        for (int i = 0; i < poolObjects.Length; i++)
        {
            GameObject go = Instantiate(Prefab) as GameObject;
            Transform t = go.transform;
            t.SetParent(transform);
            t.position = Vector3.one * 1000;
            poolObjects[i] = new PoolObject(t);
        }

        if (spawnImmediate)
        {
            SpawnImmediate();
        }
    }

    void Spawn()
    {
        Transform t = GetPoolObject();
        if (t == null) return;//if true , this indicates that poolSize is too small
        Vector3 pos = Vector3.zero;
        pos.x = defaultSpawnPos.x;
        pos.y = Random.Range(ySpawnRange.min, ySpawnRange.max);
        t.position = pos;
    }

    void SpawnImmediate()
    {
        Transform t = GetPoolObject();
        if (t == null) return;//if true , this indicates that poolSize is too small
        Vector3 pos = Vector3.zero;
        pos.x = immediateSpawnPos.x;
        pos.y = Random.Range(ySpawnRange.min, ySpawnRange.max);
        t.position = pos;
        Spawn();
    }


    void Shift()
    {
        for (int i = 0; i < poolObjects.Length; i++) //step 3 ; variable used
        {
            poolObjects[i].transform.position += -Vector3.right * shiftSpeed * Time.deltaTime;
            CheckDisposeObject(poolObjects[i]);
        }
    }

    void CheckDisposeObject(PoolObject poolObject)
    {
        if (poolObject.transform.position.x < -defaultSpawnPos.x)
        {
            poolObject.Dispose();
            poolObject.transform.position = Vector3.one * 1000;
        }
    }

    Transform GetPoolObject()
    {
        for (int i = 0; i < poolObjects.Length; i++)
        {
            if (!poolObjects[i].inUse)
            {
                poolObjects[i].Use();
                return poolObjects[i].transform;
            }
        }
        return null;
    }
}

Я понимаю, что PoolObject объявлен, но он не выводит никакого значения или выводит null. Я попытался присвоить значение PoolObject с помощью этого метода: PoolObject = GetComponent (); но затем я получаю другую ошибку, которая читает; Assets / scripts / Parallaxerr.cs (45,9): ошибка CS0118: Parallaxerr.PoolObject' is atype, но ожидалась переменная и Assets / scripts / Parallaxerr.cs (45,35): ошибка CS0131: левая часть назначения должна быть переменной, свойством или индексатором.

Может кто-нибудь, пожалуйста, покажите мне способ присвоить значение PoolObject, чтобы мой код мог работать, пожалуйста

Какая строка кода вызывает исключение?

Chetan Ranpariya 26.07.2018 12:40

строки 134 и 82

yogi 26.07.2018 12:42

В строке 145/146 вы сначала удаляете объект, а затем меняете на нем значения? Звучит неправильно. То же в строке 67/68.

Thomas Weller 26.07.2018 12:44

И как я узнаю, какая строка 134 в вашем коде?

Chetan Ranpariya 26.07.2018 12:45

@ChetanRanpariya мой плохой, новенький на форуме,

yogi 26.07.2018 12:48

for (int i = 0; i <poolObjects.Length; i ++) // шаг 3; используемая переменная

yogi 26.07.2018 12:48

void Update () {if (game.GameOver) return; Сдвиг(); spawnTimer + = Time.deltaTime; если (spawnTimer> spawnRate) {Spawn (); spawnTimer = 0; }}

yogi 26.07.2018 12:50

Вы вызываете метод конфигурации перед вызовом метода сдвига?

Chetan Ranpariya 26.07.2018 12:52

@ChetanRanpariya: да, в моем коде я вызываю метод настройки перед методом сдвига.

yogi 26.07.2018 13:36

@ThomasWeller да, но, насколько я понимаю, это не имеет ничего общего с ссылкой на объект, не установленной для экземпляра объекта. Однако, если я ошибаюсь, пожалуйста, простите мое невежество, так как я начал изучать C только в начале этого месяца.

yogi 26.07.2018 13:42

Вы вызываете метод конфигурации перед вызовом метода обновления? Можете ли вы поделиться кодом, который использует этот объект класса Parallaxerr и вызывает для него методы?

Chetan Ranpariya 26.07.2018 14:06

@ChetanRanpariya Нет, я сначала вызываю метод обновления, а затем метод настройки.

yogi 26.07.2018 14:11

@ChetanRanpariya, код слишком длинный, чтобы добавлять его в комментарии. Могу я отправить его вам по электронной почте?

yogi 26.07.2018 14:14

Метод Configure инициализирует массив poolObjects. И метод shift использует этот массив. Итак, если вы сначала вызываете метод обновления, это означает, что метод сдвига пытается использовать неинициализированный массив, который имеет значение NULL. Поэтому вам нужно исправить код для вызова метода конфигурации перед вызовом любых других методов.

Chetan Ranpariya 26.07.2018 14:16

@ChetanRanpariya Я только что сделал это и сначала вызвал метод настройки, но нет никакой разницы, я все еще получаю исключение NullReferenceException в том же коде

yogi 26.07.2018 14:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
15
57
0

Другие вопросы по теме