Невозможно получить положение мыши в мировом пространстве - PullRequest
0 голосов
/ 11 июня 2018

Я начал возиться с Unity, как несколько дней назад, и я не эксперт по кодированию, так что извините, если я упускаю что-то очевидное.

В течение нескольких часов я пытался нарисовать линию от объекта на экране до места, где я щелкаю в 2D-пространстве, и с треском проваливался.Я гуглил это, но не мог найти рабочее решение.Проблема в том, что когда я щелкаю, линия рисуется от объекта до положения камеры, а не от положения мыши.Я не знаю, что делать на этом этапе.Я мог бы использовать некоторую помощь.

Вот упрощенная версия кода.

public class test: MonoBehaviour {


public Rigidbody rb;
public Vector3 vect3;

void Start () {
    rb = GetComponent<Rigidbody>();

}

void Update () {

    if (Input.GetKey(KeyCode.Mouse0))
    {
        vect3 = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 0); 
        //I made the vector's Z value 0 because the object's Z coordinate is also 0. 
        //It is to avoid capturing 3D coordinates. 
        Debug.DrawLine(rb.position, Camera.main.ScreenToWorldPoint(vect3), Color.red, 1);

    }

}

}

edit: исправлена ​​ошибка метода в коде.

edit2: я ее решил.Получается, что переменная z параметра Camera.main.ScreenToWorldPoint (vect3) представляет расстояние от камеры, и, поскольку я установил значение 0, линия рисуется непосредственно на камеру.Изменение значения z в vect3 на transform.position.z - Camera.main.transform.position.z это исправило.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Input.mouseposition дает позицию в пространстве экрана (в пикселях).Вам необходимо использовать ScreenToWorldPoint, чтобы получить положение мыши относительно камеры, которая его просматривает. Вот документ, необходимый: https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html

РЕДАКТИРОВАТЬ: неверно истолковать ваш вопрос.По какой-то странной причине я не могу удалить свой ответ, поэтому проигнорируйте его, пожалуйста.

0 голосов
/ 11 июня 2018

Надеюсь, я понял вашу проблему.
Что вы можете сделать, это сохранить последнюю точку как переменную и использовать ее для рисования следующей линии.

public class test: MonoBehaviour {

public Rigidbody rb;
public Vector3 lastPoint;

void Start () {
    rb = GetComponent<Rigidbody>();
}

void Update () {
    if (Input.GetKey(KeyCode.Mouse0))
    {
        Vector3 vect3 = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 0); 
        vect3 = Camera.main.ScreenToWorldPoint(vect3);
        //I made the vector's Z value 0 because the object's Z coordinate is also 0. 
        //This is to capture location in 2D space instead of 3D. This might be the problem. 
        if(lastPoint == null) {
             lastPoint = vect3,
             return;
        }
        Debug.DrawLine(lastPoint, vect3, Color.red, 1);
        lastPoint = vect3;
    }
}
...