Вращающееся поле зрения с игроком - PullRequest
1 голос
/ 14 мая 2019

Итак, я пытаюсь создать систему, которая ищет уступ для подъема. У меня есть вертикальное поле зрения, которое ищет эти выступы, и я до сих пор заставлял его вращаться в направлении аналоговой ручки, чтобы я мог найти выступ и перейти к нему, куда указывает мой аналог. (Посмотри вверх, найди выступ, поднимись и т. Д.). Моя проблема в том, что когда поле обзора перемещается туда, куда мне нужно, оно остается неподвижным на одной оси и не вращается вместе с игроком.

What I have so far

На рисунке конус обращен туда, где он должен быть, и вращается вокруг игрока так, как я этого хочу, но, как вы можете видеть, конус обращен к оси X и не двигается оттуда. Я хочу, чтобы он вращался вместе с плеером.

В приведенном ниже коде возвращаемое значение y вектора Vector указывает конус вверх. Я перепробовал все виды функций в значениях x и z, но ничего не торчит.

public Vector3 DirFromAngle(float angleInDegrees, bool angleIsGlobal)
{
    if(!angleIsGlobal)
    {
        angleInDegrees += (viewDir + 90);
    }

    Vector3 newValue = new Vector3(0, Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
    return newValue;
}

Значение viewDir заставляет вращаться конус с моей аналоговой ручкой, чтобы заставить вращаться конус с моим плеером, я предполагаю, что нужно что-то сделать со значениями x или z, или с обоими, но для моей жизни, Я не могу понять это. Спасибо за любую помощь в этом вопросе. Извиняюсь, если мое объяснение не очень хорошее.

enter image description here enter image description here

void OnSceneGUI()
    {
        LedgePointSearch lps = (LedgePointSearch)target;
        Handles.color = Color.white;
        Handles.DrawWireArc(lps.transform.position, lps.transform.forward * 90, Vector3.up, 360, lps.viewRadius);
        Vector3 viewAngleA = lps.DirFromAngle(-lps.viewAngle / 2, false);
        Vector3 viewAngleB = lps.DirFromAngle(lps.viewAngle / 2, false);

        Handles.DrawLine(lps.transform.position, lps.transform.position + viewAngleA * lps.viewRadius);
        Handles.DrawLine(lps.transform.position, lps.transform.position + viewAngleB * lps.viewRadius);
    }

Это скрипт редактора, отображающий поле зрения.

Круг просто представляет радиус поля зрения, как далеко он выходит.

https://www.dropbox.com/s/k9siha2aog9vj8o/fov.mp4?dl=0

В видео круг вращается вместе с игроком, а конус вращается с моими левыми аналоговыми движениями. Я хочу, чтобы конус был похож на круг, вращаясь так, как это делает мой игрок, но при этом соответствуя моим аналогичным движениям.

1 Ответ

0 голосов
/ 14 мая 2019

Один из способов подойти к этому - найти вращение Y игрока и применить его к newValue перед возвратом.

public Vector3 DirFromAngle(float angleInDegrees, bool angleIsGlobal)
{
    if(!angleIsGlobal)
    {
        angleInDegrees += (viewDir + 90);
    }

    Vector3 newValue = new Vector3(0, Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));

    // get Y rotation of player
    yRotationAngle = player.transform.rotation.eulerAngles.y;

    // convert to Quaternion using only the Y rotation
    Quaternion yRotation = Quaternion.Euler(0f, yRotationAngle + 90f, 0f);

    // Apply yRotation
    newValue = yRotation * newValue;

    return newValue;
}    
...