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
相关产品推荐
相关产品推荐

