You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动