Я пытаюсь создать бесконечную игру раннеров, такую как ротатор , используя следующий учебник . Согласно учебнику, игрок остается в том же положении, в то время как трубы движутся к игроку. Я хочу реализовать систему, в которой игрок движется вперед, а трубы появляются, когда игрок движется вперед. Я изменил код в системе каналов (Раздел 3 учебника) следующим образом: `
public Pipe pipePrefab;
public int pipeCount;
private Pipe[] pipes;
private List<Pipe> pipes1 = new List<Pipe>();
private void Awake()
{
pipes = new Pipe[pipeCount];
for (int i = 0; i < pipes.Length; i++)
{
Pipe pipe = pipes[i] = Instantiate<Pipe>(pipePrefab);
pipes1.Add(pipe);
pipe.transform.SetParent(transform, false);
if (i > 0)
{
pipe.AlignWith(pipes[i - 1]);
}
}
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Pipe pipe = Instantiate<Pipe>(pipePrefab);
pipes1.Add(pipe);
pipe.transform.SetParent(transform, false);
for (int i = 0; i < pipes1.Count; i++)
{
if (i > 0)
{
pipe.AlignWith(pipes1[i - 1]);
}
}
}
if (Input.GetMouseButtonDown(1))
{
Destroy(GetComponent<Transform>().GetChild(0).gameObject);
}
}
}
Это прекрасно работает для создания новых каналов при нажатии левой кнопки мыши. Однако, когда я пытаюсь удалить канал, используя правую кнопку мыши, я получаю следующую ошибку (в сценарии канала):
"MissingReferenceException: объект типа 'Pipe' был уничтожен, но вы все еще пытаетесь чтобы получить к нему доступ. Ваш сценарий должен либо проверить, является ли он нулевым, либо вы не должны уничтожать объект. "
Когда я нажимаю на ошибку, он выводит меня в два места, одно в сценарии системы трубопроводов и посмотри в трубе скрипт. Вот строка в системе каналов, которая выдает ошибку:
for (int i = 0; i < pipes1.Count; i++)
{
if (i > 0)
{
pipe.AlignWith(pipes1[i - 1]);
}
}
И это метод сценария канала, который выдает ошибку. Ошибка в строке 2 (transform.SetParent (pipe.transform, false)):
public void AlignWith(Pipe pipe)
{
float relativeRotation = Random.Range(0, curveSegmentCount) * 360f / pipeSegmentCount;
transform.SetParent(pipe.transform, false);
transform.localPosition = Vector3.zero;
transform.localRotation = Quaternion.Euler(0f, 0f, -pipe.curveAngle);
transform.Translate(0f, pipe.curveRadius, 0f);
transform.Rotate(relativeRotation, 0f, 0f);
transform.Translate(0f, -curveRadius, 0f);
transform.SetParent(pipe.transform.parent);
transform.localScale = Vector3.one;
}
Я не могу понять, что происходит с этим. Другой вариант - вместо того, чтобы разрушать трубы во время движения игрока, я должен был бы установить их в неактивное состояние, но это привело бы к большим проблемам с производительностью.