Зависит от того, что вы подразумеваете под «ближе».
Предположим, что цель находится в комнате с дверью и windows напротив нее.
Цель находится вертикально и смотрит на дверь, а обратная цель смотрит на windows, но вверх ногами.
Объект смотрит между дверью и windows, только чуть ближе к windows и находится в вертикальном положении.
Какой кандидат "ближе" для ваших нужд?
Если вы считаете, что цель здесь «ближе», поскольку объект уже находится в вертикальном положении, и вы заботитесь обо всей разнице вращения между объектом и целью, вы можете использовать Quaternion.Angle
, чтобы определить, какая имеет меньшее отличие от поворота идентификатора:
Transform target;
Transform subject;
Quaternion subjectRot = subject.rotation;
Quaternion targetRot = target.rotation;
// however you define "inverse" here
Qutaternion invTargetRot = targetRot * Quaternion.Euler(180f,0f,0f);
float angleToTarget = Quaternion.Angle(subjectRot, targetRot);
float angleToInvTarget = Quaternion.Angle(subjectRot, invTargetRot);
if (angleToTarget <= angleToInvTarget)
{
// alignment with target is closer
}
else
{
// alignment with inverse of target is closer
}
Если вы считаете, что обратная цель здесь «ближе», потому что вы заботитесь только об одном местном направлении объекта / цели (например, вперед) и не заботятся о других (например, вверх / вправо), тогда вы можете просто использовать Vector3.Angle
для сравнения направлений, и если угол меньше 90 градусов, он ближе к выравниванию:
Transform target;
Transform subject;
// or *.up, or *.right depending on your needs
float angleToTarget = Vector3.Angle(subject.forward, target.forward);
if (angleToTarget <= 90f)
{
// alignment with target is closer
}
else
{
// alignment with inverse of target is closer
}