我在编辑器中有
Vector3 v3Pos = EditorGUILayout.Vector3Field ("Position", myTarget.posV3);
if (EditorGUI.EndChangeCheck ()) {
// code
}
我想使用两个标有“-”和“ +”的按钮,它们可以模拟在轴上拖动鼠标以更改值。 一旦选择了Vector3的三个字段之一,则每次在选定的轴上单击都会获得对象的精确运动。 问题不是代码,而是如何识别在X,Y,Z之间选择了哪个字段。 我看到了EditorGUIUtility.hotControl,但不清楚我是否可以选择使用哪个轴。
答案 0 :(得分:1)
所以听起来实际上您将需要3个FloatField
来使用GUI.GetNameOfFocusedControl
和GUI.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
,而是使用SerializedProperty
和EditorGUILayout.PropertyField