Объект Unity не вращается в положение мыши - PullRequest
0 голосов
/ 21 января 2020

Итак, у меня есть сценарий, который я получил от Blackthornprods, посвященного боевому видео на YouTube с самого начала. Я пытаюсь заставить свое оружие вращаться вокруг моего игрового объекта сферы, но по какой-то причине оно не поворачивается туда, где находится положение мыши, но когда я прыгаю, оно вращается странным образом не по отношению к мыши, а случайно (я предполагаю случайно). Моя игра 3D, и его учебник был для 2d. Буду очень признателен за любую попытку найти решение. Вот мой код:

void Update()
{
    Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
    float rotZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
    transform.rotation = Quaternion.Euler(0f, 0f, rotZ + offset);

}

Оружие еще вращается вокруг оси Z.

1 Ответ

1 голос
/ 21 января 2020

Во-первых, Camera.main вызывает FindGameObjectsWithTag, что является дорогостоящей операцией, поэтому (, как сказано в документации ), вам следует вызывать ее как можно меньше раз и кэшировать результат:

Camera mainCam;

void Awake()
{
    mainCam = Camera.main;
}

Во-вторых, вы используете ScreenToWorldPoint неправильно. Если это действительно трехмерная игра, как описывает вопрос, вы должны предоставить глубину от камеры в качестве z-компонента аргумента. Вы можете использовать векторную математику, чтобы сделать это, и в результате вы получите мировую позицию, в которой вы можете поставить курсор в точке .:

Camera mainCam;

void Awake()
{
    mainCam = Camera.main;
}

void Update()
{
    float objectDepthFromCamera = Vector3.Dot(
            transform.position - mainCam.transform.position, 
            mainCam.transform.forward); 

    Vector3 cursorWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition 
            + Vector3.forward * objectDepthFromCamera);

Тогда предположим, что «фронт» объекта направлен наружу. направление, вы можете использовать необязательный второй параметр Quaternion.SetRotation, чтобы установить вращение, указывающее на курсор:

Camera mainCam;

void Awake()
{
    mainCam = Camera.main;
}

void Update()
{
    float objectDepthFromCamera = Vector3.Dot(
            transform.position - mainCam.transform.position, 
            mainCam.transform.forward); 

    Vector3 cursorWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition 
            + Vector3.forward * objectDepthFromCamera);

    transform.rotation = Quaternion.LookRotation(Vector3.forward,
            cursorWorldPosition - transform.position);
}

Если передняя часть объекта указывает на локальное правильное направление, вы можете использовать Vector3.Cross, чтобы определить, в каком направлении должен указывать локальный верх:

Camera mainCam;

void Awake()
{
    mainCam = Camera.main;
}

void Update()
{
    float objectDepthFromCamera = Vector3.Dot(
            transform.position - mainCam.transform.position, 
            mainCam.transform.forward); 

    Vector3 cursorWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition 
            + Vector3.forward * objectDepthFromCamera);

    Vector3 localUpNeeded = Vector3.Cross(Vector3.forward, 
            cursorWorldPosition - transform.position);

    transform.rotation = Quaternion.LookRotation(Vector3.forward, localUpNeeded);
}
...