Unity 3d, наведите объект на мышь (3d пространство) - PullRequest
0 голосов
/ 20 января 2019

Я некоторое время искал, но не мог понять, как решить эту неприятную ошибку. Я использую вид сверху вниз (указывая на -z), в основном 2d с трехмерными объектами и камерой в режиме перспективы.

Мне нужно ориентировать объект на мышь, игнорируя аспект z, так как все движется в одной плоскости.

Я использую следующий код:

 Vector3 mouseToWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 1f));
 mouseToWorld.z = 0f;
 Vector3 difference = mouseToWorld - transform.position;
 difference.Normalize();
 float angle = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
 transform.rotation = Quaternion.Euler(0f, 0f, angle - 90);

К сожалению, он работает только тогда, когда объект неподвижен, и прерывается, как только скорость становится> 0;

Любая подсказка будет оценена :)

p.s. Я добавляю 1 к z, а затем сбрасываю его, потому что в противном случае mouseToWorld постоянно равен 0, куда бы я ни перемещал указатель.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Спасибо за ответ!Я понял, что вам нужно вычесть расстояние между игроком и камерой до начальной позиции мыши:

Vector3 mouseToWorld = Camera.main.ScreenToWorldPoint (Input.mousePosition - new Vector3 (0, 0, Camera.main.transform.position.z));

Вот рабочий скрипт:

    Vector3 mouseToWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition - new Vector3(0, 0, Camera.main.transform.position.z));
    //Debug.DrawLine(transform.position, mouseToWorld);
    mouseToWorld.z = 0f;
    Vector3 difference = mouseToWorld - transform.position;
    difference.Normalize();

    float angle = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
    transform.rotation = Quaternion.Euler(0f, 0f, angle - 90);
0 голосов
/ 20 января 2019

Возможно, он сломается, потому что вектор скорости и направление мыши не совпадают.

следующий скрипт заставит стрелку следовать за мышью, она в основном такая же, как ваша, за исключением того, что она также обновляет позицию:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowMouse : MonoBehaviour {
    public float moveSpeed = 0.01f;
    // Use this for initialization
    void Start () {
    }

  // Update is called once per frame
  void Update () {
        transform.position = Vector2.Lerp(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition), moveSpeed);

        Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        difference.Normalize();
        float rotation_z = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(0f, 0f, rotation_z);
    }
}
...