OnInspectorGUI: получить выделенное поле вектора 3 - PullRequest
0 голосов
/ 14 февраля 2019

В моем редакторе у меня есть

Vector3 v3Pos = EditorGUILayout.Vector3Field ("Position", myTarget.posV3);
if (EditorGUI.EndChangeCheck ()) {
  // code
}

Я хотел бы использовать две кнопки, помеченные «-» и «+», которые позволяют имитировать перетаскивание мыши на оси для изменения значений.После того, как выбрано одно из трех полей Vector3, я получу точное движение объекта при каждом щелчке по выбранной оси.Проблема не в коде, а в том, как определить, какое поле между X, Y, Z было выбрано.Я видел EditorGUIUtility.hotControl, но мне не ясно, могу ли я узнать, какая ось была выбрана с ним.

1 Ответ

0 голосов
/ 14 февраля 2019

Так что на самом деле вам понадобится 3 FloatField с вместо того, чтобы пересобрать пользовательский векторный вид, подобный Vector3, используя GUI.GetNameOfFocusedControl и GUI.SetNextControlName и выполнение

EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("position");
EditorGUILayout.LabelField("X", GUILayout.Width(12));
GUI.SetNextControlName("myX");
var floatX = EditorGUILayout.FloatField(myTarget.posV3.x);

EditorGUILayout.LabelField("Y", GUILayout.Width(12));
GUI.SetNextControlName("myY");
var floatY = EditorGUILayout.FloatField(myTarget.posV3.y);

EditorGUILayout.LabelField("Z", GUILayout.Width(12));
GUI.SetNextControlName("myZ");
var floatZ = EditorGUILayout.FloatField(myTarget.posV3.z);
EditorGUILayout.EndHorizontal();

EditorGUILayout.HelpBox("Currently selected field is " + GUI.GetNameOfFocusedControl(), MessageType.None);

EditorGUILayout.BeginHorizontal();

var selectedField = GUI.GetNameOfFocusedControl();

if (GUILayout.Button("-"))
{
    switch (selectedField)
    {
        case "myX":
            floatX -= 0.01f;
            break;

        case "myY":
            floatY -= 0.01f;
            break;

        case "myZ":
            floatZ -= 0.01f;
            break;
    }
}

if (GUILayout.Button("+"))
{
    switch (selectedField)
    {
        case "myX":
            floatX += 0.01f;
            break;

        case "myY":
            floatY += 0.01f;
            break;

        case "myZ":
            floatZ += 0.01f;
            break;
    }
}

EditorGUILayout.EndHorizontal();

myTarget.posV3 = new Vector3(floatX, floatY, floatZ);

Однако я не уверен, что это дало бы вам лучший контроль, поскольку afaik OnInpsctorGUI вызывается не постоянно, как Update, а скорее с нерегулярными интервалами.

Кроме того, каждый раз, когда вы нажимаете кнопку, поле теряет фокус, поэтому вам придется снова его устанавливать.


Вы также заметите, что оно в основном , но .Вы не увидите изменения до тех пор, пока поле не потеряет фокус ... Я бы рекомендовал написать полное CustomPropertyDrawer для Vector3 и вместо этого использовать SerializedProperty и EditorGUILayout.PropertyField

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