Можно ли сделать мгновенное удаление объекта (до окончания кадра)?

Можно ли сделать мгновенное удаление объекта?

Я так понимаю Destroy() производит удаление в конце кадра, в частности, после OnCollisionEnter(). Есть возможность удалить объект до завершения OnCollisionEnter()?

Ну, это я так понимаю свою проблему:) Если говорить подробнее, то: внутри столкновения вызывается: _stateHoneyGetter.OnEnter(_honeyGiver)

private void OnCollisionEnter(Collision collision)
{
    //Если объект может давать мёд, то берём его
    _honeyGiver = collision.gameObject.GetComponent<IHoneyGiver>();

    if (_honeyGiver is IHoneyGiver && сurrentHoneyStocks < parameters.maxHoneyStocks)
    {
        _stateMovement.OnExit();
        _stateHoneyGetter.OnEnter(_honeyGiver);
    }
}

Там запускается корутин:

public void OnEnter(object honeyGiver)
{
    coroutine = HoneyGet((IHoneyGiver)honeyGiver, _parameters.getHoneyTime);
    _bee.StartCoroutine(coroutine);
}

public IEnumerator HoneyGet(IHoneyGiver honeyGiver, float waitTime)
{
    while (true)
    {
        //Проверяем может ли пчела ещё взять мёд и наличие объекта у которого мы хотим взять мёд, если нет свободных мест возникает ошибка
        if (сurrentHoneyStocks < _parameters.maxHoneyStocks && !honeyGiver.Equals(null))
            try
            {
                сurrentHoneyStocks +=
                    honeyGiver.HoneyGive(_beeGmOdj, _parameters.getHoney);
            }
            catch
            {
                _stateMovement.OnEnter<HoneyGoTo>();
                yield break;
            }

        //Проверяем существует ли дающий мёд, если нет, дальше ищем мёд
        if (honeyGiver.Equals(null))
        {
            _stateMovement.OnEnter<HoneyGoTo>();
            yield break;
        }
        //Проверяем заполненность хранилища мёда пчелы, если оно заполнено летим в улей Hive
        else if (сurrentHoneyStocks >= _parameters.maxHoneyStocks)
        {
            _stateMovement.OnEnter<GoTo>();
            yield break;
        }

        yield return new WaitForSeconds(waitTime);
    }
}

И вот непосредственное взятие мёда с цветка:

public float HoneyGive(GameObject whosAsking, float honey)
{
    if (!(!(honeyGetters.Contains(whosAsking)) ^ !canCollectHoney))
        throw new ArgumentException("This object can't take honey. The seats are occupied or it doesn't have an IHoneyConsumer");

    if (сurrentHoneyStocks - honey >= 0)
    {
        сurrentHoneyStocks = сurrentHoneyStocks - honey;
        return honey;
    }
    else
    {
        Destroy(transform.root.gameObject);
        return сurrentHoneyStocks;
    }
}

А теперь вопрос по поводу вот этой штуки:

        Destroy(transform.root.gameObject);
        return сurrentHoneyStocks;

Первое что меня удивило, что return Таки возвращает остатки мёда. И это меня порадовало. А огорчило меня то, что после этого, при проверке существования honeyGiver :

        //Проверяем существует ли дающий мёд, если нет, дальше ищем мёд
        if (honeyGiver.Equals(null))

honeyGiver всё ещё существует и из-за этого происходит лишний вызов корутина, из-за чего пчела висит на месте лишний тик.

Ладно, я обойдусь без остатков мёда, не обязательно что-то возвращать, но можно как-то мгновенно удалить объект, что бы не происходило лишнего вызова?


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

Автор решения: Sergey Skvortsov

Вы можете удалять объекты сразу использую DestroyImmediate(gameObject); Но это ОЧЕНЬ плохая практика, приводящая к куче проблем. Лучше завести у honeyGiver публичное поле IsExhausted. Или HoneyGive может возвращать (float honey, bool IsExhausted).

→ Ссылка