UEDL3-3——对象关联、各类型输入

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
EditorGUILayout.ObjectField()        //在编辑器窗口上添加对象关联控件,可以关联一个Unity对象,需要配套一个Object变量
EditorGUILayout.IntField() //在编辑器窗口上添加输入int值控件,需要配套一个Object变量
EditorGUILayout.LongField() //在编辑器窗口上添加输入long值控件,需要配套一个long变量
EditorGUILayout.FloatField() //在编辑器窗口上添加输入float值控件,需要配套一个float变量
EditorGUILayout.DoubleField() //在编辑器窗口上添加输入double值控件,需要配套一个double变量
EditorGUILayout.TextField() //在编辑器窗口上添加输入字符串的控件,需要配套一个字符串变量
EditorGUILayout.Vector2Field() //在编辑器窗口上添加输入Vector2值控件,需要配套一个Vector2变量
EditorGUILayout.Vector3Field() //在编辑器窗口上添加输入Vector3值控件,需要配套一个Vector3变量
EditorGUILayout.Vector4Field() //在编辑器窗口上添加输入Vector4值控件,需要配套一个Vector4变量
EditorGUILayout.RectField() //在编辑器窗口上添加输入Rect值控件,需要配套一个Rect变量
EditorGUILayout.BoundsField() //在编辑器窗口上添加输入Bounds值控件,需要配套一个Bounds变量
EditorGUILayout.BoundsIntField() //在编辑器窗口上添加输入BoundsInt值控件,需要配套一个BoundsInt变量

对象关联控件

ObjectField​控件可以让我们关联Unity的对象,例如:游戏对象(预设体),材质,音效,继承MonoBehaviour​的脚本等等
同样,需要一个继承Unity的Object​变量来表示关联了哪个对象,
需要将该变量传入到方法内,再由该变量接收本帧用户关联的对象(需要as​对应的类型)

该控件可以通过SerializedProperty​直接修改MonoBehaviour​脚本对象的属性,使用SerializedProperty​就不需要配套额外变量

  • 参数一:序列化属性SerializedProperty​,可直接修改MonoBehaviour​脚本对象的属性,使用该参数则无需另外配套变量
  • 参数二:文本标题(可选,可改为GUIContent​)
  • 参数三:显示关联的对象(传入在外部声明的相应变量)
  • 参数四:关联的对象的类型(需要继承自Unity的Object​)
  • 参数五:是否可以关联场景上的对象资源(例如关联GameObject​相关,如果该参数为false​,则只能关联工程文件夹里的预设体)
  • 参数六:GUILayoutOption​(使用EditorGUI​绘制时可选)
  • 返回值:本帧关联的对象(Unity的Object​类型,需要as​成对应类型,如果使用序列化属性就不需要接收了)
1
2
3
4
5
6
7
8
9
10
GameObject obj;
GameObject obj2;
Texture tex;

private void OnGUI()
{
obj = EditorGUILayout.ObjectField("游戏对象关联", obj, typeof(GameObject), true) as GameObject;
obj2 = EditorGUILayout.ObjectField("预设体对象关联", obj2, typeof(GameObject), false) as GameObject;
tex = EditorGUILayout.ObjectField("材质关联", tex, typeof(Texture), false) as Texture;
}

显示效果如下:image

各类型输入控件

以下控件可以让我们输入各种类型的值,例如:int​、long​、float​、Vector3​、Rect​、Bounds​等等
同样,需要一个相对应的变量来表示该控件输入的值,
需要将该变量传入到方法内,再由该变量接收本帧用户输入的值

  • 参数一:文本标题(可选,可改为GUIContent​)
  • 参数二:显示输入的值(传入在外部声明的相应变量)
  • 参数三:GUIStyle​(可选)
  • 参数四:GUILayoutOption​(使用EditorGUI​绘制时可选)
  • 返回值:本帧输入的值

一共有如下的输入控件:

  • int​变量:EditorGUILayout.IntField("Int输入:", int变量)
  • long​变量:EditorGUILayout.LongField("long输入:", long变量)
  • float​变量:EditorGUILayout.FloatField("Float输入:", float变量)
  • double​变量:EditorGUILayout.DoubleField("double输入:", double变量)
  • string​变量:EditorGUILayout.TextField("Text输入:", string变量)
  • Vector2​变量:EditorGUILayout.Vector2Field("Vec2输入: ", vector2变量)
  • Vector3​变量:EditorGUILayout.Vector3Field("Vec3输入: ", vector3变量)
  • Vector4​变量:EditorGUILayout.Vector4Field("Vec4输入: ", vector4变量)
  • Rect​变量:EditorGUILayout.RectField("rect输入:", rect变量)
  • Bounds​变量:EditorGUILayout.BoundsField("Bounds输入: ", bounds变量)
  • BoundsInt​变量:EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt变量)

Bounds​:包围盒,类似于两个Vector3组合,一个是中心点,另一个是范围盒体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int i;
long l;
float f;
double d;
string s;
Vector2 vector2;
Vector3 vector3;
Vector4 vector4;
Rect rect;
Bounds bounds;
BoundsInt boundsInt;

private void OnGUI()
{
i = EditorGUILayout.IntField("Int输入框", i);
l = EditorGUILayout.LongField("long输入框", l);
f = EditorGUILayout.FloatField("Float 输入:", f);
d = EditorGUILayout.DoubleField("double 输入:", d);

s = EditorGUILayout.TextField("Text输入:", s);
vector2 = EditorGUILayout.Vector2Field("Vec2输入: ", vector2);
vector3 = EditorGUILayout.Vector3Field("Vec3输入: ", vector3);
vector4 = EditorGUILayout.Vector4Field("Vec4输入: ", vector4);
rect = EditorGUILayout.RectField("rect输入: ", rect);
bounds = EditorGUILayout.BoundsField("Bounds输入: ", bounds);
boundsInt = EditorGUILayout.BoundsIntField("BoundsInt输入: ", boundsInt);
}

显示效果如下:image

注意:EditorGUILayout​中还有一些Delayed​开头的输入控件,
他们和普通输入控件最主要的区别是:在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改

1
2
3
4
5
6
7
8
9
int i1, i2;

private void OnGUI()
{
i1 = EditorGUILayout.IntField("Int即时输入框", i1);
EditorGUILayout.LabelField(i1.ToString());
i2 = EditorGUILayout.DelayedIntField("Int延迟输入框", i2);
EditorGUILayout.LabelField(i2.ToString());
}

显示效果如下:image

观察显示内容发现,由EditorGUILayout.DelayedIntField​绘制的控件,在输入值按下回车键或将焦点从字段移开之前,返回值不会更改