Перезапустите номер OBJ при включении - PullRequest
0 голосов
/ 27 марта 2020

Я запускаю объекты при запуске (maxObj = 75), затем уничтожаю объекты Obj и отключаю Spawner Obj. Когда игрок хочет, он может включить спавнер. Мне нужно рассчитывать, чтобы начать с 0 при включении. Спаун еще 75 объектов и затем уничтожается. и др c. Спасибо за любую помощь, спасибо.

enter code here
 private static readonly float _spawnTime = 0.125f;

    [SerializeField]

    private GameObject _asteroidObject = null;

    [SerializeField]
    private int _maxObjects = 0;

    private int _spawnedObjects = 0;

    private float _time = 0;

    private void Update()
    {
        if(_spawnedObjects < _maxObjects)
        {
            if(_time > _spawnTime)
            {
                Instantiate(_asteroidObject, transform.position, Quaternion.identity);
                ++_spawnedObjects;
                _time = 0;
            }
            _time += Time.smoothDeltaTime;
        }
    }

Ответы [ 2 ]

0 голосов
/ 27 марта 2020
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnObj : MonoBehaviour
{
    [SerializeField]
    private GameObject _asteroidPrefab;

    [SerializeField]
    private float _spawnInterval = 0.125f;

    [SerializeField]
    private int _maxObjects;

    private bool _canStart = true;

    private void Start()
    {
        StartSpawn();
    }
    // However your player calls this method
    public void StartSpawn()
    {
        // Only start spawning if there is no other spawn routine already running
        if (_canStart) StartCoroutine(Spawn());
    }

    private IEnumerator Spawn()
    {
        // Just in case ignore if another routine is already running
        if (!_canStart) yield break;

        // block concurrent routines
        _canStart = false;

        var interval = new WaitForSeconds(_spawnInterval);

        for (var i = 0; i < _maxObjects; i++)
        {
            Instantiate(_asteroidPrefab, transform.position, Quaternion.identity);

            // yield makes Unity pause this routine and render the frame
            // and continue from here in the next frame
            // Then since we yield return another IEnumerator in thi case WaitForSconds
            // it results exactly in this: Holds here for given seconds and then goes to the next iteration 
            yield return interval;
        }
        // re-enable the StartSpawn
        _canStart = true;
    }
}
0 голосов
/ 27 марта 2020

Прикоснитесь, совершенно неясно, как пользователь сможет запустить спавн снова, я бы рекомендовал использовать Coroutine в целом. Они похожи на маленькие временные Update блоки, но их легче контролировать и обслуживать. Это также более эффективно, так как он не вызывает метод Update каждый кадр, даже когда количество maxObjects уже достигнуто и ничего не произойдет в любом случае

[SerializeField] 
private GameObject _asteroidPrefab;

[SerializeField] 
private float _spawnInterval = 0.125f;

[SerializeField] 
private int _maxObjects;

private bool _canStart = true;

// However your player calls this method
public void StartSpawn()
{
    // Only start spawning if there is no other spawn routine already running
    if(_canStart) StartCoroutine(Spawn());
}

private IEnumerator Spawn()
{
    // Just in case ignore if another routine is already running
    if(!_canStart) yield break;

    // block concurrent routines
    _canStart = false;

    var interval = new WaitForSeconds(_spawnInterval);

    for(var i = 0; i < _maxObjects; i++)
    {
        Instantiate(_asteroidObject, transform.position, Quaternion.identity);

        // yield makes Unity pause this routine and render the frame
        // and continue from here in the next frame
        // Then since we yield return another IEnumerator in thi case WaitForSconds
        // it results exactly in this: Holds here for given seconds and then goes to the next iteration 
        yield return interval;
    }

    // re-enable the StartSpawn
    _canStart = true;
}

Тогда, если вы также захотите автоматически начать порождать в начале вы можете просто позвонить в

private void Start()
{
    StartSpawn();
} 
...