
Сообщение от
SlavikSG
В ходе работы над скриптом, возник вопрос такого плана. Имеем событие убиения зенитки. После чего стразу удаляем ее трупик. Пишем такой код:
Код:
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
(actor as AiGroundActor).Destroy();
Sss("Удалили красную зену: " + actor.Name());
}
}
и получаем стопроцентную ошибку.
Но если пишем все в точности так же, но делаем задержку в одну секунду, то никакой ошибки не возникает.
Код:
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
Timeout(1, () =>
{
(actor as AiGroundActor).Destroy();
Sss("Удалили красную зену: " + actor.Name());
});
}
}
Почему такое происходит???
Вы уничтожаете объект (actor as AiGroundActor).Destroy(); а затем - пытаетесь получить его имя - actor.Name(). Если актор уже успел задестроиться, то Вы пытаетесь получить .Name() от null-a, что даст ошибку естественно. С таймаутом дестрой может позже произойти поэтому ошибки не будет.
Можно сделать что-то типа этого -
Код:
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundActor)
{
string actorName = actor.Name();
(actor as AiGroundActor).Destroy();
if (actor == null)
Sss("Удалили красную зену: " + actorName);
}
}