В Update cтреляем лучом по коллайдеру и получаем у него нужный нам родительский объект.
Physics.Raycast(weapon.position, weapon.forward, out gunsightHit, 200, HitMask);
Collider _col = gunsightHit.collider;
Получаем из него объект
victim = _col.GetComponentInParent<VictimScript>();
И что то с ним делаем.
Вопрос - вышеприведённые методы довольно таки просаживают FPS, так как GetComponent в Update.
Предполагаемое мной решение - сделать к Collider некий AttachedScript,аналогично AttachedRigidbody. Чтобы вместо GetComponent просто написать что то вроде
victim = _col.attachedScript;
Но не нашёл в сети ничего подобного. Как подобное можно реализовать? Чтобы у всех Collider появилось дополнительное поле в редакторе, куда можно поставить какой нибудь объект - для ссылки на него при попадании луча.
Если это крайне труднореализуемо(исходники Unity вроде как закрыты), то подскажите альтернативный способ решения проблемы производительности при применении подобной связки(Raycast->Collider->GetComponent)
Практически точно ничего из этого хорошего не получится.
Можно попробывать написать что-то "лучше" чем GetComponent, но если получится - можно смело пушить это в Unity3d репозиторий.
Подобные проблемы я решал добавлением корутины. Обычно нет требований делать проверки в каждом кадре - можно сделать корутину с необходимым временем обновления (.1f секунды обычно достаточно).
IEnumerator Do()
{
while (true)
{
Physics.Raycast(weapon.position, weapon.forward, out gunsightHit, 200, HitMask);
var _col = gunsightHit.collider;
victim = _col.GetComponentInParent<VictimScript>();
//PROFIT
yield return new WaitForSeconds(.1f);
}
}
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники