Unity 2019.3.14f中Selection.activeGameObject不存在的报错求助
解决Unity EditorWindow中
Selection.activeGameObject的CS0117错误 这个错误CS0117: 'Selection' does not contain a definition for 'activeGameObject'看起来有点反常,毕竟UnityEditor.Selection.activeGameObject是Unity Editor API里的标准成员,在2019.3版本中肯定是支持的。结合你的代码和排查过的操作,我来拆解原因和解决办法:
错误核心原因
最大概率是命名冲突:你的项目里存在一个自定义的类/结构体,名字也叫Selection,导致编译器优先识别你自己写的Selection,而非UnityEditor命名空间下的官方类。你已经试过重启Unity和重载项目,所以排除了编辑器缓存导致的命名空间识别问题,命名冲突是最可能的元凶。
另外,你的代码里还有一个小语法错误:loadCell(map.getCell(tile.coordinates)));这里多了一个右括号,这也会导致编译失败,记得一起修正。
具体解决步骤
1. 排查并解决命名冲突
- 在Unity的Project窗口搜索框中输入
Selection,查看是否有自己编写的脚本/类和官方Selection重名。 - 如果找到重名类,直接给它改个独特的名字(比如
CustomSelection),编译器就能正确识别UnityEditor的Selection了。
2. 用完全限定名强制指定官方Selection
如果暂时不想改名,或者没找到重名类,可以直接在代码里用完全限定名锁定官方Selection,把这行代码:
GameObject obj = Selection.activeGameObject;
修改为:
GameObject obj = UnityEditor.Selection.activeGameObject;
这样就明确告诉编译器要使用UnityEditor命名空间下的Selection类,彻底避免歧义。
3. 确认脚本位置合规
- 确保
CellViewer.cs放在Assets/Editor文件夹下,因为Editor相关API只能在Editor目录的脚本中使用,放在普通目录会导致API无法被识别。 - 再次确认代码顶部的
using UnityEditor;没有被注释,也没有其他代码覆盖这个命名空间。
修正后的完整代码示例
这里帮你修正了语法错误和Selection引用问题:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class CellViewer : EditorWindow { private Map map; [MenuItem ("Window/Cell Viewer")] public static void ShowWindow() { EditorWindow.GetWindow(typeof(CellViewer)); } void OnGUI () { if(Map.isInstanceActive()) { // 使用完全限定名避免命名冲突 GameObject obj = UnityEditor.Selection.activeGameObject; Tile tile = obj.GetComponent<Tile>(); if(tile != null) { map = Map.Instance(); // 修正多余的右括号 loadCell(map.getCell(tile.coordinates)); } } } // 假设你有这个loadCell方法的实现 private void loadCell(Cell targetCell) { // 你的逻辑代码 } }
内容的提问来源于stack exchange,提问作者Ryan Norman
相关产品推荐
相关产品推荐

