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

EditorGUILayout.ObjectField无法接收引用问题求助

解决Unity自定义编辑器ObjectField拖拽无效果的问题

嘿,兄弟,我一眼就瞅出问题在哪了——你当前的代码里完全没在OnGUI方法中绘制用于选择对象的ObjectField控件!这就导致窗口里根本没有接收拖拽输入的UI元素,自然没法给target变量赋值,点击按钮时它肯定是空的。

下面是修复后的完整代码,我给你加了关键的控件绘制逻辑,还补充了序列化和测试功能:

public class AddInventory : EditorWindow { 
    [SerializeField] // 让Unity序列化保存这个字段,窗口重启后不会丢失选择
    public Inventory target; 

    [MenuItem("Inventory/Add items")] 
    public static void ShowWindow() { 
        GetWindow<AddInventory>("Add items"); 
    } 

    void OnGUI() { 
        // 给标题加个加粗样式,看起来更清晰
        GUILayout.Label("Add items ...", EditorStyles.boldLabel);
        
        // 核心:绘制ObjectField控件,支持拖拽Inventory实例或挂载它的GameObject
        target = (Inventory)EditorGUILayout.ObjectField(
            "Target Inventory", 
            target, 
            typeof(Inventory), 
            true // 允许选择场景中的对象,若只允许选Project资源可设为false
        );

        // 加个测试按钮,方便你验证target是否正确赋值
        if(GUILayout.Button("Verify Target")){
            if(target != null){
                Debug.Log($"Successfully assigned: {target.gameObject.name}");
            } else {
                Debug.LogWarning("Please select an Inventory target first!");
            }
        }
    }
}

再给你几个关键的注意事项:

  • 确保你的Inventory脚本是继承自MonoBehaviour(用于挂载到GameObject)或者ScriptableObject(作为资源文件)的,否则ObjectField无法识别它
  • 拖拽时,你可以直接拖场景中挂载了Inventory的GameObject,也可以拖Project面板里的预制体/Inventory资源文件
  • 加上[SerializeField]是为了让Unity保存target的值,不然每次关闭窗口再打开,之前选的对象就没了

现在你再运行这个编辑器窗口,拖拽对象到ObjectField里,就能看到字段正确保留选中的对象了,点击测试按钮也能在Console里看到对应的输出~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:51:25