Бесконечный бегун - порождающий бесконечные трубы - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать бесконечную игру раннеров, такую ​​как ротатор , используя следующий учебник . Согласно учебнику, игрок остается в том же положении, в то время как трубы движутся к игроку. Я хочу реализовать систему, в которой игрок движется вперед, а трубы появляются, когда игрок движется вперед. Я изменил код в системе каналов (Раздел 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;
}

Я не могу понять, что происходит с этим. Другой вариант - вместо того, чтобы разрушать трубы во время движения игрока, я должен был бы установить их в неактивное состояние, но это привело бы к большим проблемам с производительностью.

...