Unity项目中解决程序集重复引用与CS0246错误的方案
解决Unity Test Framework单元测试中的重复引用与CS0246错误
一、修复程序集重复引用问题
1. 排查asmdef引用冲突
项目中自动生成程序集(Assembly-CSharp、Assembly-CSharp-Editor)与自定义asmdef(如Sub_1.asmdef、测试程序集asmdef)容易出现重复引用:
- 打开所有asmdef文件,检查
references节点,移除冗余引用:比如Sub_1.asmdef若已包含必要依赖,就不要重复引用Assembly-CSharp;测试程序集只保留核心依赖(测试框架+目标业务程序集)。 - 确保自定义asmdef没有循环引用(比如A引用B,B又引用A)。
2. 重置程序集缓存
- 关闭Unity,删除
Library/ScriptAssemblies目录下的所有.dll文件,重新启动Unity让程序集重新生成,清除残留的旧引用缓存。
3. 规范Plugins目录的asmdef配置
- Plugins下
Editor子目录的脚本,必须在asmdef中设置"includePlatforms": ["Editor"],避免运行时程序集混入编辑器代码。 - 运行时专用的Plugins脚本,设置
"excludePlatforms": ["Editor"],防止编辑器程序集重复加载运行时代码。
二、解决Error CS0246:找不到类型或命名空间
1. 修正测试程序集的引用配置
- EditMode测试:若被测类
ClassName在Scripts目录(属于Assembly-CSharp),需在EditMode.asmdef中显式添加Assembly-CSharp引用(即使Assembly-CSharp-Editor默认引用它,手动添加可避免自动引用失效):{ "name": "Game.EditModeTests", "references": [ "UnityEngine.TestRunner", "UnityEngine.TestRunner.NUnit", "Assembly-CSharp", "Assembly-CSharp-Editor" ], "includePlatforms": ["Editor"], "testAssembly": true } - PlayMode测试:若被测类在Plugins的自定义运行时程序集(如
Sub_n有独立asmdef),需将该asmdef添加到PlayMode.asmdef的references中;若Plugins脚本无asmdef,Unity会将其归入Assembly-CSharp-firstpass,需在PlayMode.asmdef中引用这个程序集。
2. 检查命名空间与using指令
- 确认被测类
ClassName的命名空间,在测试脚本头部添加对应的using语句,比如using Game.Core;(假设ClassName在Game.Core命名空间下)。 - 避免测试脚本的命名空间(如
GeneratedTests.EditMode)与被测类的命名空间冲突。
3. 匹配测试类型与脚本平台归属
- EditMode测试只能引用编辑器平台程序集和运行时程序集;PlayMode测试只能引用运行时程序集。若
ClassName是编辑器专用脚本(在Editor目录或标记为编辑器程序集),需将对应的测试移到EditMode目录下。 - Plugins下
Editor子目录的脚本仅能被EditMode测试引用,普通Plugins目录的脚本可被PlayMode测试引用,确保测试类型与脚本平台匹配。
4. 验证脚本的程序集归属
- 检查被测脚本所在目录是否有asmdef:如果脚本在无asmdef的目录,会被归入Unity自动生成的程序集;如果有asmdef,需确保测试程序集已引用该asmdef。
内容的提问来源于stack exchange,提问作者Springboss LP




