Генерация монеток в игре Unity

174
18 апреля 2022, 16:30

помогите реализовать логику генерации монеток. В целом код работает, только выдает ошибку Null Reference из-за того, что монетка не создана, а я пытаюсь к ней обратиться в самом нижнем условии. Не могу придумать, как правильно реализовать это, чтобы не выдавало ошибку. Монетка создается один раз в пять "итераций".

void Update()
    {
        if (spawnItems.Iteration % 5 == 0 && spawnItems.Iteration != 0 && canInst)
        {
            InstCoin = Instantiate(Coin, coinStartPos, Quaternion.identity) as GameObject;
            isSpawned = true;
        }
        if (spawnItems.Iteration % 5 != 0)
        {
            Destroy(InstCoin, 0.01f);
            isSpawned = false;
            canInst = true;
            
        }
        if (InstCoin.transform.position == coinStartPos)
            canInst = false;
        CoinMove();
    }
Answer 1
public class CoinSpawner : MonoBehaviour {
    [SerializeField] private GameObject _coinPrefab;
    [SerializeField] private float _spawnStep = 2f;
    [SerializeField] private float _destroyDelay = 3f;
    private List<Transform> _coins;
    private Transform _transform;
    private IEnumerator _spawnCoroutine;
    
    public void StartSpawn () {
        if (_spawnCoroutine == null) {
            _spawnCoroutine = CoinSpawnCoroutine(_spawnStep);
            StartCoroutine(_spawnCoroutine);
        }
    }
    
    public void StopSpawn () {
        StopCoroutine(_spawnCoroutine);
        _spawnCoroutine = null;
    }
    
    private void Start () {
        _transform = transform;
        _coins = new List<Transform>();
        StartSpawn();
    }
    
    private void Update () {
        Move();
    }
    
    private void SpawnCoin () {
        if (_coinPrefab != null) {
            GameObject NewCoin = Instantiate(_coinPrefab, _transform.position, Quaternion.identity);
            Transform CoinTransform = NewCoin.transform;
            _coins.Add(CoinTransform);
            StartCoroutine(DestroyDelayCoroutine(_destroyDelay, CoinTransform));
        }
    }
    
    private void RemoveCoin (Transform target) {
        if (target != null) {
            _coins.Remove(target);
            Destroy(target.gameObject);
        }
    }
    
    private void Move () {
        foreach (Transform coin in _coins)
            coin.localPosition += Vector3.up*Time.deltaTime;
    }
    
    private IEnumerator SpawnCoroutine(float step) {
        float Timer = 0;
        while (true) {
            yield return null;
            Timer += Time.deltaTime;
            if (Time >= step) {
                Time -= step;
                SpawnCoin();
            }
        }
    }
    
    private IEnumerator DestroyDelayCoroutine (float delay, Transform target) {
        yield return new WaitForSeconds(delay);
        RemoveCoin(target);
    }
}
Answer 2

Вы монетку создаете каждый пятый кадр, а проверяете ее каждый кадр. То есть 4 кадра из 5 переменная InstCoin будет равна null. А у null нельзя получить ни transform, ни позицию. Ничего

READ ALSO
Разбивка текста на предложения и слова [дубликат]

Разбивка текста на предложения и слова [дубликат]

Задача с юлёрна https://ulearnme/course/basicprogramming/Praktika_Parser_predlozheniy__d41a27ad-a377-4fbd-ba1c-1bd761c69dd1

126
Строка подключение Entity для MSSQL на хостинге

Строка подключение Entity для MSSQL на хостинге

Доброе время суток, Взял хостинг goodhostkz, добавил проект и импортировал БД, но не как не могу настроить строку подключение

134
C# проверка входных параметров

C# проверка входных параметров

Не лишняя ли здесь проверка enum параметра? (UserRole - enum-объект)И вообще нужна ли проверка на enum типы во входных параметрах?! Спасибо за внимание!

170
Не могу запустить службу WCF ASP.NET

Не могу запустить службу WCF ASP.NET

Создал пустой apsnet проект

126