Хорошо, если я вас правильно понял, на этот раз проблема в том, что ваше смещение работает до тех пор, пока преобразование не масштабировано и не повернуто.
Причина в том, что
transform.position + boundingOffset
используетпростые мировые координаты.Как вы можете видеть, смещение от оранжевой до красной точки одинаково (в мировых координатах) на обоих изображениях.
Скорее всего, вам нужно смещение относительно положения и масштаба transform
.Вы можете преобразовать boundingOffset
в локальные координаты относительно преобразования, используя TransformPoint
Преобразование position
из локального пространства в мировое пространство.
Так что вместо этого используйте
Collider[] colliders = Physics.OverlapBox(transform.TransformPoint(boundingOffset), boundingExtents / 2, blueprint.transform.rotation);
В основном это
transform.position
+ transform.right * boundingOffset.x * transform.lossyScale.x
+ transform.up * boundingOffset.y * transform.lossyScale.y
+ transform.forward * boundingOffset.z * transform.lossyScale.z;
В качестве альтернативы
Чуть более приемлемый подход, который я часто использую в таких случаях.случай не предоставляет boundingOffset
через жестко заданный вектор / вектор поля, вместо этого просто используйте дочерний GameObject, например, с именем OffsetPivot
, и поместите его в сцену так, как вы хотите.Поскольку он является потомком вашего transform
, он всегда будет сохранять правильное смещение при повороте / масштабировании / перемещении родителя.
Тогда в коде я просто сделаю
[SerializeField] private Transform boundingOffsetPivot;
...
Collider[] colliders = Physics.OverlapBox(boundingOffsetPivot.position, boundingExtents / 2, blueprint.transform.rotation);