Во-первых, вызывайте Camera.main
как можно реже, поскольку использует дорогостоящую операцию (FindGameObjectsWithTag
) и не кэширует результат.
private Camera mainCamera;
void Awake()
{
mainCamera = Camera.main;
}
Кому ответьте на свой вопрос, не используйте ScreenToWorldPoint
в этой ситуации, потому что глубину вычислить нелегко. У вас нет ничего значимого для использования с компонентом z, и transform.position.x
здесь не имеет смысла.
Вместо этого создайте Plane
, на который вы хотите нажать (например, плоскость, параллельную осмотрите плоскость и пересекаете объект), используйте ScreenPointToRay
, чтобы повернуть положение мыши в Ray
, затем найдите, где пересекаются луч и плоскость. Plane.Raycast
намного, намного быстрее, чем физическая лучевая трансляция. Затем найдите направление от положения мира мыши к объекту и используйте Quaternion.LookRotation, чтобы превратить это направление в вращение, которое вы можете назначить для вращение объекта:
Ray mouseRay = mainCamera.ScreenPointToRay(Input.mousePosition);
Plane mousePlane = new Plane(mainCamera.transform.forward, transform.position);
float rayDistance;
if (mousePlane.Raycast(mouseRay, out rayDistance))
{
Vector3 mouseWorldPos = mouseRay.GetPoint(rayDistance);
// make the z component of mouseWorldPos the same as transform.position
mouseWorldPos.z = transform.position.z;
Vector3 awayFromMouseDir = transform.position - mouseWorldPos;
transform.rotation = Quaternion.LookRotation(awayFromMouseDir, Vector3.up);
}