@GingerSibe

Как мне реализовать лучше всего проверку нахождения в триггере?

Здравствуйте, 2D игра, вот у меня есть игрок мне нужно создать спавнер в котором будет появляться печенька(хилка)
когда игрок возьмёт её и отойдёт от через пару секунд должна появиться новая печенька, вопрос как правильно реализовать проверку "Есть ли уже печенька в спавнере, если нет, то заспавнить" и "если заспавнилась печенька, то следующий объект не должен быть печенькой, а к примеру стаканом", сама печенька у меня появляется как дочерний объект спавнера, а проверку не могу нормально реализовать.
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
@Farawa
сделай общий класс Item и наследуй печеньки и стаканы от него и уничтожай при юзе
public abstract class Item : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.layer == 6)//тут введи номер слоя игрока
        {
            UseItem();
        }
    }

    protected abstract void UseItem();

    private void OnDestroy()
    {
        transform.parent.GetComponent<Spawner>().OnItemUse?.Invoke();
    }
}

public class Spawner : MonoBehaviour
{
    [SerializeField] private float spawnDelay = 2f;
    [SerializeField] private GameObject[] items;
    private float lastSpawn;
    public Action OnItemUse;
    private int lastItemIndex = -1;

    private void Start()
    {
        var index = UnityEngine.Random.Range(0, items.Length);
        SpawnItem(index);
        OnItemUse += delegate { StartCoroutine(SpawnItemCoroutine()); };
    }

    private IEnumerator SpawnItemCoroutine()
    {
        int index = 0;
        while (index != lastItemIndex)
        {
            index = UnityEngine.Random.Range(0, items.Length);
        }
        if (lastSpawn + spawnDelay > Time.time)
        {
            float waitTime = Time.time - lastSpawn + spawnDelay;
            yield return new WaitForSeconds(waitTime);
        }
        SpawnItem(index);
    }
    private void SpawnItem(int index)
    {
        Instantiate(items[index], transform);
        lastSpawn = Time.time;
    }
    private void OnDestroy()
    {
        OnItemUse = null;
    }
}
public class Cookie : Item
{
    protected override void UseItem()
    {
        //твой код
        Destroy(gameObject);
    }
}

не проверял, но по идее должно работать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы