Одна из стратегий - спроецировать положение вашего объекта на экранное пространство.Затем вычислите вектор между положением вашей стрелки и этим спроецированным положением.Вы можете использовать этот вектор для вычисления угла поворота, например, от вертикального направления, используя Dot Product, за которым следует acos.
Наконец, вам нужно сделать небольшой расчет для перекрестного произведения, чтобы решить, будет ли указанное вращение по часовой стрелке или против часовой стрелки.
Вот пример кода:
public GameObject Target;
RectTransform rt;
void Start()
{
rt = GetComponent<RectTransform>();
}
void Update()
{
// Get the position of the object in screen space
Vector3 objScreenPos = Camera.main.WorldToScreenPoint(Target.transform.position);
// Get the directional vector between your arrow and the object
Vector3 dir = (objScreenPos - rt.position).normalized;
// Calculate the angle
// We assume the default arrow position at 0° is "up"
float angle = Mathf.Rad2Deg * Mathf.Acos(Vector3.Dot(dir, Vector3.up));
// Use the cross product to determine if the angle is clockwise
// or anticlockwise
Vector3 cross = Vector3.Cross(dir, Vector3.up);
angle = -Mathf.Sign(cross.z) * angle;
// Update the rotation of your arrow
rt.localEulerAngles = new Vector3(rt.localEulerAngles.x, rt.localEulerAngles.y, angle);
}
Для приведенного выше кода, я предполагаю, что:
- Вы используете только одну основную камеру, вам может понадобитьсячтобы изменить это
- Ваша стрелка находится на холсте, по умолчанию она направлена вверх (при повороте (0, 0, 0))
- Вы используете холст в режиме рендеринга: пространство экрана- Наложение.Приведенный выше код был бы другим, если бы Canvas находился в World Space.