Можно ли сделать мгновенное удаление объекта (до окончания кадра)?
Можно ли сделать мгновенное удаление объекта?
Я так понимаю 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 шт):
Вы можете удалять объекты сразу использую
DestroyImmediate(gameObject);
Но это ОЧЕНЬ плохая практика, приводящая к куче проблем.
Лучше завести у honeyGiver публичное поле IsExhausted.
Или HoneyGive может возвращать (float honey, bool IsExhausted).