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

помогите реализовать логику генерации монеток. В целом код работает, только выдает ошибку 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();
    }

Ответы (2 шт):

Автор решения: Максим Фисман

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

→ Ссылка
Автор решения: Yaroslav
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);
    }
}
→ Ссылка