Создание и уничтожение игровых объектов каждое определенное количество кадров в Unity - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь создавать объекты и удалять их каждые 50 кадров.линейные объекты были успешно созданы, но они так и не были уничтожены!Я даже пытался destroyimmediate () и до сих пор не работает .., пожалуйста, помогите ... Мой код никогда не работал так:

private int _currentInterval = 50;
private int _maxIntervalValue = 50; 
private int i = 0;

// Update is called once per frame
void Update () {
    if (_currentInterval == _maxIntervalValue)
    {
        float x = Random.Range(-10.0f, 10.0f), y = Random.Range(-10.0f, 10.0f);
        DrawRay(i, new Vector3(0, 0, 0), new Vector3(x, 10, y));
        i++;
        _currentInterval--;
    }
    else if (_currentInterval <= 0)
    {
        Destroy(GameObject.Find("Ray_" + i));
        _currentInterval = _maxIntervalValue;
    }
    else
        _currentInterval--;
}

private void DrawRay(int ID, Vector3 StartPoint, Vector3 EndPoint)
{
    #region Create Line
    GameObject Ray = new GameObject();
    Ray.transform.position = StartPoint;
    Ray.AddComponent<LineRenderer>();
    Ray.name = "Ray_" + ID;
    LineRenderer lr = Ray.GetComponent<LineRenderer>();
    lr.material = new Material(Shader.Find("Particles/Alpha Blended Premultiply"));
    lr.SetColors(Color.red, Color.red);
    lr.SetWidth(0.05f, 0.05f);
    lr.SetPosition(0, StartPoint);
    lr.SetPosition(1, EndPoint);
    #endregion
}

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

В начале счетчик будет = 50, и он создаст объект, затем он будет уменьшен до = 0, и в этот момент объект, который мы только что создали, должен быть удален

1 . Когда вы создаете экземпляр объекта, подобного этому GameObject Ray = new GameObject();, вам нужно сделать переменную GameObject Ray глобальной переменной, чтобы вы могли обращаться к ней и впоследствии уничтожить ее.Это лучше, чем искать его с помощью GameObject.Find, чтобы уничтожить его.

2 . Вам не нужно большинство переменных в вашем коде.То, что вы делаете, можно упростить с помощью Time.frameCount, проверив, является ли Time.frameCount % 50 0.

3 . Не называйте вашу переменную Ray потому что существует Unity API с таким именем.

Упрощенная версия кода для того, что вы пытаетесь сделать.DrawRay удален, но вы можете добавить это.

GameObject obj = null;

void Start()
{
    //Create new one
    obj = new GameObject();
}

void Update()
{
    //Check if 50 frames has passed
    if (Time.frameCount % 50 == 0)
    {
        //Destroy old one
        if (obj != null)
            DestroyImmediate(obj);

        //Create new one again
        obj = new GameObject();
    }
}

Не используйте этот код в вашей функции DrawRay.В вашем коде будет утечка памяти при каждом создании нового Material.Используйте Объединение объектов , чтобы повторно использовать объекты.

0 голосов
/ 09 июня 2018

Просто сделайте свой счетчик Destroy(GameObject.Find("Ray_" + (i-1)));.Прямо сейчас GameObject.Find, который он пытается найти, на один счет выше вашего первоначального значения, которого в данный момент не существует.Это должно решить вашу проблему с объектом, который не будет уничтожен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...