Что ж, вы, вероятно, сталкиваетесь с каким-то другим коллайдером, некоторым GameObject, к которому не подключен ни один компонент, и имеет метод с именем DamageZombie
.
Существует несколько способов ограничить Raycast указанием c цели:
Physics.Raycast
принимает дополнительные параметры
maxDistance
Максимальное расстояние луча должен проверять наличие столкновений.
layerMask
Маска слоя, используемая для выборочного игнорирования коллайдеров при наведении луча.
Так что ставьте своих врагов цели на указанном c Layer вы уже можете ограничить Raycast
, чтобы он попадал только в них и только тогда, когда они достаточно близко:
// Adjust here which layer(s) you want to hit via the Inspector
public LayerMask targetLayers;
...
if (Physics.Raycast(new Ray(transform.position, transform.forward), out var hit, 1f, (int)targetLayers))
{
// Do something
}
Так что это уже фильтрует лучевую трансляцию и только попадает на первый объект, найденный в пределах диапазона 1
, и только на слой (слои), настроенный в targetLayers
.
Как вы и сказали, что хотели на hit everything
вы можете использовать Physics.RaycastAll
и затем выполнять тьфу все попадания
var hits = Physics.RaycastAll(new Ray(transform.position, transform.forward), 1f, targetLayers);
foreach(var hit in hits)
{
// Do something
}
Теперь это в основном делает то же самое, что и раньше, но теперь поражает каждый объект в пределах диапазона 1
юнитов и на слое (ях), настроенных в targetLayers
.
Используя Теги , вы можете еще больше ограничиться и проверить после того, как Raycast, что вы нажали.
foreach(var hit in hits)
{
if(!hit.CompareTag("Zombie")) continue;
// Do something
}
Наконец, вообще НЕ используйте SendMessage
! Это крайне неэффективно и небезопасно ... вы никогда не узнаете, есть ли у объекта, который вы ударили, даже компонент, реализующий такой метод вообще ... или если вы изменили эту строку в каждом месте после переименования метода ...
Скорее получите компонент, который хотите поразить!
var damageScript = hit.GetComponent<YOURSCRIPT>();
if(damageScript)
{
damageScript.DamageZombie(DamageAmount);
}