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

Unity项目中解决程序集重复引用与CS0246错误的方案

解决Unity Test Framework单元测试中的重复引用与CS0246错误

一、修复程序集重复引用问题

1. 排查asmdef引用冲突

项目中自动生成程序集(Assembly-CSharpAssembly-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测试:若被测类ClassNameScripts目录(属于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.asmdefreferences中;若Plugins脚本无asmdef,Unity会将其归入Assembly-CSharp-firstpass,需在PlayMode.asmdef中引用这个程序集。

2. 检查命名空间与using指令

  • 确认被测类ClassName的命名空间,在测试脚本头部添加对应的using语句,比如using Game.Core;(假设ClassNameGame.Core命名空间下)。
  • 避免测试脚本的命名空间(如GeneratedTests.EditMode)与被测类的命名空间冲突。

3. 匹配测试类型与脚本平台归属

  • EditMode测试只能引用编辑器平台程序集和运行时程序集;PlayMode测试只能引用运行时程序集。若ClassName是编辑器专用脚本(在Editor目录或标记为编辑器程序集),需将对应的测试移到EditMode目录下。
  • Plugins下Editor子目录的脚本仅能被EditMode测试引用,普通Plugins目录的脚本可被PlayMode测试引用,确保测试类型与脚本平台匹配。

4. 验证脚本的程序集归属

  • 检查被测脚本所在目录是否有asmdef:如果脚本在无asmdef的目录,会被归入Unity自动生成的程序集;如果有asmdef,需确保测试程序集已引用该asmdef。

内容的提问来源于stack exchange,提问作者Springboss LP

火山引擎 最新活动