You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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工作逻辑共同决定的:

  1. C#引用类型的传值特性
    虽然Object是引用类型,但C#默认是传值传递——这里传递的是obj变量的引用副本。也就是说,方法内部拿到的是一个指向原对象的"指针副本"。如果用户在字段中选择了新对象,方法需要更新这个引用,但修改副本不会影响外部的原变量。所以必须把新的引用作为返回值,让外部变量重新赋值,才能让原变量指向新对象。

  2. Unity编辑器的重绘机制
    编辑器的UI是每帧(或每次触发重绘)都会重新执行OnInspectorGUI/OnGUI方法。每次调用ObjectField时,需要传入当前的对象值来显示控件的状态;当用户修改选择后,方法返回新的对象,你必须把它赋值给原变量,这样下次重绘时,控件才能显示最新的选择结果。如果不赋值,下次调用时还是传入旧值,控件会回到之前的状态,用户的修改就丢失了。

简单说:方法没法直接修改你传入的变量本身,只能把新的结果返回给你,让你自己更新变量,同时这也是编辑器UI保持状态的必要手段。

内容的提问来源于stack exchange,提问作者FogyX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:39:52