OnInspectorGUI:获取Vector3的选定字段

时间:2019-02-14 13:10:16

标签: c# unity3d

我在编辑器中有

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

我想使用两个标有“-”和“ +”的按钮,它们可以模拟在轴上拖动鼠标以更改值。 一旦选择了Vector3的三个字段之一,则每次在选定的轴上单击都会获得对象的精确运动。 问题不是代码,而是如何识别在X,Y,Z之间选择了哪个字段。 我看到了EditorGUIUtility.hotControl,但不清楚我是否可以选择使用哪个轴。

1 个答案:

答案 0 :(得分:1)

所以听起来实际上您将需要3个FloatField来使用GUI.GetNameOfFocusedControlGUI.SetNextControlName并执行以下操作来重新构建自定义Vector3样的视图

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,而是使用SerializedPropertyEditorGUILayout.PropertyField