是否可以立即删除对象?
据我了解,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 仍然存在,因此,会发生额外的协程调用,因此蜜蜂会在原地挂起一个额外的滴答声。
好的,我会不用剩下的蜂蜜,没有必要返回一些东西,但是我可以以某种方式立即删除该对象,这样就不会有额外的调用?
您可以立即删除对象,
DestroyImmediate(gameObject);但这是一种非常糟糕的做法,会导致很多问题。最好有一个honeyGiver公共领域IsExhausted。或者HoneyGive可能返回(float honey, bool IsExhausted)。