Свободно редактируйте кватернион из меню отладки инспектора в редакторе Unity - PullRequest
2 голосов
/ 28 марта 2020

У меня есть кватернион, который я хотел бы установить в качестве свойства преобразования объекта в редакторе Unity. Режим отладки на вкладке инспектора показывает текущее значение кватерниона, и его можно редактировать, однако я не могу установить поля одно за другим без их немедленной перезаписи. Похоже, что Unity пытается исправить / нормализовать его после каждого редактирования. Как я могу отключить это? Есть ли другой способ просто ввести значение кватерниона в редакторе единиц?

«Преобразовать его в углы Эйлера» не является приемлемым ответом на этот вопрос.

1 Ответ

1 голос
/ 30 марта 2020

Насколько я знаю, эту функцию нельзя отключить.

Однако, если использование обычного инспектора приемлемо, здесь может помочь пользовательский инспектор.

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

using UnityEngine;

public class Demo : MonoBehaviour
{
    public Vector4 rotation;
    public bool updateFromTransform = true;

    void Update()
    {
        // for testing purposes
        // transform.Rotate(0.3f * Vector3.up); 

        if (updateFromTransform)
        {
            rotation.x = transform.localRotation.x;
            rotation.y = transform.localRotation.y;
            rotation.z = transform.localRotation.z;
            rotation.w = transform.localRotation.w;
        }

    }
}

И пользовательский редактор, включающий кнопку для применения изменений Vector4 к локальному вращению:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Demo))]
public class DemoEditor : Editor

    SerializedProperty rotation
    SerializedProperty updateFromTransform;
    private void OnEnable()
    {
        rotation = serializedObject.FindProperty("rotation");
        updateFromTransform = serializedObject.FindProperty("updateFromTransform");
    }

    public override void OnInspectorGUI()
    {
        Demo d = (Demo)target;
        serializedObject.Update();

        EditorGUILayout.PropertyField(updateFromTransform);
        EditorGUILayout.PropertyField(rotation);

        serializedObject.ApplyModifiedProperties();

        if (GUILayout.Button("Apply as local rotation"))
        {
            d.updateFromTransform = true;
            d.transform.localRotation = 
                    new Quaternion(d.rotation.x, d.rotation.y, d.rotation.z, d.rotation.w);
        }

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