Рассмотрите возможность манипулирования вашими слоями во время выполнения.
Включение / отключение столкновений для определенных объектов с целыми слоями
Physics.IgnoreCollision и Physics.IgnoreLayerCollision позволяют отключать столкновения между двумя коллайдерами и между двумя слоями соответственно.
Если вы хотите исключить конкретный коллайдер из коллизий, нет встроенного способа сделать это. Если вы используете не кинематические твердые тела с не триггерными коллайдерами, ответ будет всегда, даже если вы попытаетесь отфильтровать ответы по тегу.
Мы выполнили это в нашем проекте, создав слой «Void». Пустота ни с чем не сталкивается.
Теперь вы можете временно отключить столкновение коллайдера, установив для его слоя значение «Void», и снова включить его, восстановив его старый слой.
Вот суть:
int oldLayer = -1;
int voidLayer;
void Start()
{
voidLayer = LayerMask.NameToLayer("Void");
}
void DisableCollider(Collider col)
{
oldLayer = col.gameObject.layer;
col.gameObject.layer = voidLayer;
}
void EnableCollider(Collider col)
{
col.gameObject.layer = oldLayer;
}
Мы сделали это специально, потому что включение и отключение коллайдеров, которые были потомками жестких тел, в некоторых обстоятельствах может действительно испортить ситуацию. Таким образом, вы не можете надежно отключить часть составного коллайдера с твердым телом, но вы можете надежно поменять местами слой одной из составных частей коллайдера.
Теперь ваша конкретная ситуация
Чтобы уменьшить влияние столкновения зомби на ваш автомобиль, подумайте о том, чтобы заставить ваших зомби запускать кинематические жесткие тела или иным образом делать их массу очень очень малой (например, float.Epsilon), чтобы воздействие не влияло на импульс автомобиля. При ударе вы также можете сделать это переключение слоя, чтобы последующие столкновения не возникали, даже если первый из них прикладывает незначительную силу к кузову автомобиля.
Вы даже можете переключить их на слой, который просто не сталкивается с автомобилем.
Вы также можете поставить еще один коллайдер на зомби, которые активируются при наезде. Таким образом вы можете подделать ударные силы OnTriggerEnter. Вы не можете получить такую точность, но вы можете приблизительно определить, где нормали контакта были достаточно хорошими, чтобы зомби бросили куда-нибудь веселое.
Вы должны спросить себя:
Хочу ли я иметь возможность сбивать разбитых зомби с моей машиной, или они должны просто играть анимацию смерти?
Меня волнует, влияют ли на скорость автомобиля и угловую скорость удары зомби?
Я предполагаю, что вы можете проверить имена объектов или добавить значение имени для классов объектов, а затем проверить это?
Тогда просто есть другая переменная, которую вы можете использовать для проверки на повышение и добавить это к проверкам.
РЕДАКТИРОВАТЬ: добавил эту переменную в.
источник
Я предполагаю, что вы используете физический движок для автоматического «отклонения», основанного на форме / массе, когда вещи сталкиваются друг с другом? если это так, тогда измените массу ваших зомби на минимальное значение, и они не будут влиять на автомобиль.
источник
Здесь есть два класса ответов:
Надеюсь это поможет!
источник