Пользовательский редактор Unity обрабатывает DrawWireArc для 2D вида - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь получить Handles.DrawWireArc для отображения в правильной ориентации при использовании 2D-вида. Таким образом, провод и линии обращены к камере.

Благодаря магии Photoshop, это то, чего я пытаюсь достичь.

Но теперь, что бы я ни указывал в параметре normal DrawWireArc, я не могу заставить его поворачиваться на Y так, чтобы он смотрел на камеру.

Это то, что я получаю в итоге:

enter image description here

При просмотре в 3D

enter image description here

Может кто-нибудь увидетьчто я делаю не так?

[CustomEditor(typeof(FieldOfView))]
public class FieldOfViewEditor : Editor
{
    private FieldOfView _fieldOfView;

    private void OnEnable()
    {
        _fieldOfView = (FieldOfView) target;
    }

    void OnSceneGUI()
    {
        Handles.color = Color.white;
        Handles.DrawWireArc(_fieldOfView.transform.position, Vector3.left, Vector3.forward, 360, _fieldOfView.viewRadius);

        Vector3 viewAngleA = DirFromAngle(_fieldOfView.transform, -_fieldOfView.viewAngle / 2, false);
        Vector3 viewAngleB = DirFromAngle(_fieldOfView.transform, _fieldOfView.viewAngle / 2, false);

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

        Handles.color = Color.red;
        foreach (Transform visibleTarget in _fieldOfView.visibleTargets)
        {
            Handles.DrawLine(_fieldOfView.transform.position, visibleTarget.position);
        }

    }

    public Vector3 DirFromAngle(Transform _transform, float angleInDegrees, bool angleIsGlobal)
    {
        if (!angleIsGlobal)
            angleInDegrees += _transform.eulerAngles.y;

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

1 Ответ

2 голосов
/ 17 октября 2019

Для первой проблемы:

Вы хотите, чтобы normal было Vector3.forward, а из было Vector3.right. Так что переключите их на

Handles.DrawWireArc(_fieldOfView.transform.position, Vector3.forward, Vector3.right, 360, _fieldOfView.viewRadius);

Затем на секунду (линии)

Поскольку вы хотите использовать ось Z, вам нужно переключить Y и Z в вашем угловом векторе и инвертировать Cos

if (!angleIsGlobal)
    // Use Z rotation here as well
    angleInDegrees += _transform.eulerAngles.z;

return new Vector3(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), -Mathf.Cos(angleInDegrees * Mathf.Deg2Rad), 0);

Теперь, например, с

public float viewAngle = 60;
public float viewRadius = 1;

это выглядит как

enter image description here


Обратите внимание, что все это в настоящее время работает, только если камера выровнена по мировой оси координат.

Как только камера сможет вращаться, вы, вероятно, будете использовать camera.tranform.forward, camera.transform.right для DrawWireArc.

Тогда вам придется принимать во внимание ориентацию камеры и дляуглы и штриховые рисунки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...