Как заставить GameObject повернуться и повернуть его в сторону от положения MouseClick в Unity? - PullRequest
0 голосов
/ 14 февраля 2020

Итак, в моем упражнении с Unity мне нужно повернуть GameObject, чтобы он отвернулся от того места, где я щелкнул мышью. Кроме того, я могу вращаться только вокруг оси Y, т. Е. GameObject может вращаться только вправо или влево и не может наклоняться к земле в любой точке. Кроме того, я должен сделать это без RayCasting (я уже сделал это с RayCasting, так что как упражнение, я должен сделать это без). Вот код, который я написал после нескольких попыток, но он кажется недостаточно эффективным:

Vector3 clickLocation = Input.mousePosition;
Vector3 clickWorldLocation = Camera.main.ScreenToWorldPoint(new Vector3(clickLocation.x, clickLocation.y, transform.position.x)); //the transform.position.x is just to add some depth 
transform.LookAt(new Vector3(clickWorldLocation.x, transform.position.y, clickWorldLocation.z), Vector3.up);

Этот код работает нормально, если мой GameObject остается в исходном положении, но не работает, если я переместил его в другое место и попытайтесь сделать то же самое. Может ли кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 14 февраля 2020

Во-первых, вызывайте 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);
}
...