Как удалить объект из массива в цикле через некоторое время - PullRequest
0 голосов
/ 25 мая 2019

Я хочу удалить (уничтожить) мои игровые объекты (препятствия) из цикла, которые генерируются случайным образом через некоторое время с помощью random.range, но не удаляются. Я пытался изменить позицию "Уничтожить (newSelected [ran], 5)" ", но не работал.

         private void OnTriggerExit(Collider theCollision)
            {

              if (theCollision.gameObject.tag == "Ob2")
               {
                a = theCollision.transform.position;
                x = a.z + 3f;
                x_ = a.z - 1f;
                startingpoint = a.x;

                for (int i = 8; i <= 64; i += 8)
                {

                    var ran = Random.Range(0, 4);
//selecting gameobjects(hurdles) by default.
                    print(ran);
                    b = new Vector3(startingpoint + i, 0.050f, Random.Range((int)x_, (int)x));
                    if (ran == 2)
                    {

                        newSelected[2]=Instantiate(gameObjects[2], new Vector3(startingpoint + i, 0.050f, a.z), Quaternion.identity);

                        print(x_);
                    }
                    else if (ran != 2)
                    {

                        newSelected[ran]=Instantiate(gameObjects[ran], b, Quaternion.identity);


                    }

                    Destroy(newSelected[ran], 5);
//I want to destroy my gameobjects(hurdles) here that are instantiate after some time.
            } 
      }
     } 
    }

1 Ответ

0 голосов
/ 25 мая 2019

Ваш код 7 раз попытается уничтожить объект в массиве newSelected с индексом random , равным 0, 1, 2 или 3. Это означает, что, например, он может попытаться уничтожить объектс индексом 0 несколько раз и, следовательно, возвращает нулевую ошибку после первого уничтожения объекта.

Чтобы избежать этой ошибки, следует проверить, что newSelected [ran] не является нулевым, прежде чем пытаться уничтожить его.

Я бы порекомендовал вам создать отдельный компонент для обработки функции уничтожения случайной задержки и добавить его в объект GameObject, который вы создаете.

Вот небольшой скрипт C #, который будет обрабатывать уничтожениеGameObject, к которому он прикреплен:

using UnityEngine;

public class DestroyAfterRandomDelay : MonoBehaviour
{

    [Tooltip("Minimum delay value")]
    public float MinimumDelay = 0f;

    [Tooltip("Maximum delay value")]
    public float MaximumDelay = 4f;

    // keeps track of elapsed time
    private float _elapsedTime= 0;

    // Keeps track of random delay 
    private float _randomDelay;

    // Start is called before the first frame update
    void Start()
    {
        // Sets random delay on start
        _randomDelay = Random.Range(MinimumDelay, MaximumDelay);

        Debug.LogFormat("{0} will be destroyed in {1} seconds!", this.name, _randomDelay);
    }

    // Update is called once per frame
    void Update()
    {

        // Increment time passed
        _elapsedTime += Time.deltaTime;

        // Proceed only if the elapsed time is superior to the delay
        if(_elapsedTime < _randomDelay) return;

        Debug.LogFormat("Destroying {0} after {1} seconds! See Ya :)", this.name, _elapsedTime);

        // Destroy this GameObject!
        Destroy(this.gameObject);

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