У меня недавно была проблема с ракетой, проходящей через цели из-за скорости, и даже при непрерывном динамическом обнаружении столкновений я не мог этого избежать.
Я решил это с помощью сценария "DontGoThroughThings" опубликовано на wiki.unity3d.com.При этом используется лучевая передача между текущими и предыдущими позициями, а затем обеспечивается завершение кадра с коллайдерами, подключенными для сообщений о событии OnTrigger.С тех пор работает каждый раз, и это просто вопрос присоединения скрипта, который очень прост в использовании.
Я думаю, что физический ответ такой, как другие предлагали использовать несколько компонентов с разным перетаскиванием, хотя обычно я думаю, что вам нужен толькоодиночный RigidBody на родителя.Вместо направления с использованием transform.LookAt вы можете попытаться вычислить с помощью Quaternion.LookRotation из hardbody.velocity.Затем используйте Vector3.Angle, чтобы узнать, сколько их.Чем больше разность углов, тем больше силы следует испытать, а затем использовать RigidBody.ApplyTorque.Возможно, используйте Sin (angleDifference) * постоянную, чтобы к моменту вращения подходило меньшее усилие.
Вот код, который я использовал на своей ракете, хотя вам придется заменить некоторые вещи, как яуказывая на неподвижную цель, и вы захотите использовать свою скорость.
var rotationDirection = Quaternion.LookRotation(lockedTarget.transform.position - this.transform.position);
var anglesToGo = Vector3.Angle(this.transform.rotation.eulerAngles, rotationDirection.eulerAngles);
if (anglesToGo > RotationVelocity)
{
var rotationDirectionToMake = (rotationDirection * Quaternion.Inverse(this.transform.rotation)).eulerAngles.normalized * RotationVelocity;
transform.Rotate(rotationDirectionToMake);
}