Unity Editor中EditorGUILayout.ObjectField()工作原理及返回值疑问
EditorGUILayout.ObjectField 方法说明
方法签名
public static Object ObjectField(String label, Object obj, Type objType, Boolean allowSceneObjects, params GUILayoutOption[] options)
该方法用于在Unity编辑器中创建可接收任意对象类型的字段控件。
参数说明
- label:字段前的可选标签。
- obj:字段当前显示的对象。
- objType:可赋值的对象类型(限制用户能选择的对象种类)。
- allowSceneObjects:是否允许选择场景中的对象(而非仅Project窗口中的资源)。
- options:可选布局选项列表,用于自定义控件的尺寸、拉伸规则等,会覆盖默认样式设置。支持的选项包括:
GUILayout.Width、GUILayout.Height、GUILayout.MinWidth、GUILayout.MaxWidth、GUILayout.MinHeight、GUILayout.MaxHeight、GUILayout.ExpandWidth、GUILayout.ExpandHeight。
使用示例
_oldFont = (Font)EditorGUILayout.ObjectField("Old font", _oldFont, typeof(Font), false);
疑问解答:为何必须使用返回值?
这是C#参数传递规则和Unity编辑器UI工作逻辑共同决定的:
C#引用类型的传值特性
虽然Object是引用类型,但C#默认是传值传递——这里传递的是obj变量的引用副本。也就是说,方法内部拿到的是一个指向原对象的"指针副本"。如果用户在字段中选择了新对象,方法需要更新这个引用,但修改副本不会影响外部的原变量。所以必须把新的引用作为返回值,让外部变量重新赋值,才能让原变量指向新对象。Unity编辑器的重绘机制
编辑器的UI是每帧(或每次触发重绘)都会重新执行OnInspectorGUI/OnGUI方法。每次调用ObjectField时,需要传入当前的对象值来显示控件的状态;当用户修改选择后,方法返回新的对象,你必须把它赋值给原变量,这样下次重绘时,控件才能显示最新的选择结果。如果不赋值,下次调用时还是传入旧值,控件会回到之前的状态,用户的修改就丢失了。
简单说:方法没法直接修改你传入的变量本身,只能把新的结果返回给你,让你自己更新变量,同时这也是编辑器UI保持状态的必要手段。
内容的提问来源于stack exchange,提问作者FogyX
相关产品推荐
相关产品推荐

