Привет, ребята, я уже 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, чтобы мой код мог работать, пожалуйста
строки 134 и 82
В строке 145/146 вы сначала удаляете объект, а затем меняете на нем значения? Звучит неправильно. То же в строке 67/68.
И как я узнаю, какая строка 134 в вашем коде?
@ChetanRanpariya мой плохой, новенький на форуме,
for (int i = 0; i <poolObjects.Length; i ++) // шаг 3; используемая переменная
void Update () {if (game.GameOver) return; Сдвиг(); spawnTimer + = Time.deltaTime; если (spawnTimer> spawnRate) {Spawn (); spawnTimer = 0; }}
Вы вызываете метод конфигурации перед вызовом метода сдвига?
@ChetanRanpariya: да, в моем коде я вызываю метод настройки перед методом сдвига.
@ThomasWeller да, но, насколько я понимаю, это не имеет ничего общего с ссылкой на объект, не установленной для экземпляра объекта. Однако, если я ошибаюсь, пожалуйста, простите мое невежество, так как я начал изучать C только в начале этого месяца.
Вы вызываете метод конфигурации перед вызовом метода обновления? Можете ли вы поделиться кодом, который использует этот объект класса Parallaxerr и вызывает для него методы?
@ChetanRanpariya Нет, я сначала вызываю метод обновления, а затем метод настройки.
@ChetanRanpariya, код слишком длинный, чтобы добавлять его в комментарии. Могу я отправить его вам по электронной почте?
Метод Configure инициализирует массив poolObjects. И метод shift использует этот массив. Итак, если вы сначала вызываете метод обновления, это означает, что метод сдвига пытается использовать неинициализированный массив, который имеет значение NULL. Поэтому вам нужно исправить код для вызова метода конфигурации перед вызовом любых других методов.
@ChetanRanpariya Я только что сделал это и сначала вызвал метод настройки, но нет никакой разницы, я все еще получаю исключение NullReferenceException в том же коде





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