Unity:编辑器项目如何访问主项目中的类?
嘿,这个问题我之前帮好几个Unity开发者解决过,本质是Unity默认的程序集引用关系在搞鬼,咱们一步步来搞定它:
Unity默认会让主项目的程序集Assembly-CSharp自动引用编辑器程序集Assembly-CSharp-Editor(毕竟编辑器脚本需要操作主项目的内容),但如果你反过来尝试让编辑器项目引用Assembly-CSharp,就会形成循环依赖——A引用B,B又引用A,编译器肯定不允许这种矛盾的关系。
核心思路是把主项目中需要被编辑器脚本引用的代码,单独拆分到一个独立的、不依赖编辑器的程序集里,再让编辑器项目引用这个程序集。具体步骤如下:
创建独立程序集定义
在主项目里,找到存放需要被编辑器引用的类的文件夹,右键选择Create > Assembly Definition,生成一个.asmdef文件(比如命名为GameShared.asmdef)。注意这个文件的Assembly Definition References列表要清空,绝对不能引用任何编辑器相关的程序集(比如Assembly-CSharp-Editor)。调整代码归属
把需要被编辑器访问的类移动到这个带.asmdef的文件夹下,Unity会自动把该文件夹内的代码归到这个新程序集里。如果不想移动文件,也可以确保这些类的命名空间和程序集逻辑匹配。让编辑器项目引用新程序集
给编辑器项目也创建一个.asmdef文件(比如EditorTools.asmdef),然后在它的Assembly Definition References里添加刚才创建的GameShared程序集。验证效果
回到Visual Studio重新生成解决方案,现在编辑器脚本应该能正常识别GameShared里的类了,而且不会再出现循环依赖的错误。
- 别在
GameShared这类共享程序集里写编辑器专属代码(比如继承Editor的类),否则这个程序集没法在运行时环境使用。 - 如果需要让编辑器访问共享程序集里的
internal成员,可以在共享程序集的AssemblyInfo.cs里添加特性:[assembly: InternalsVisibleTo("EditorTools")](把EditorTools换成你的编辑器程序集名称)。
内容的提问来源于stack exchange,提问作者Cris




