You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中生成源码无法引用OwlTree命名空间的问题排查与解决

Unity中Roslyn源码生成器无法引用OwlTree命名空间的问题解决

问题描述

在Unity中使用自定义Roslyn源码生成器时,生成的代码无法正确引用OwlTree命名空间,触发编译错误:

OwlTree.Generator\OwlTree.Generator.OwlTreeGenerator\ProjectProxyFactory.g.cs(1,7): error CS0246: 找不到类型或命名空间名称“OwlTree”(是否缺少 using 指令或程序集引用?)

同时伴随大量OwlTree命名空间下类型找不到的错误。生成的代码示例:

using OwlTree; // proxy factory所在的命名空间
using System;

public class ProjectProxyFactory : ProxyFactory
{
    ...
}

已尝试的操作

  • 按照Unity官方文档配置源码生成器,问题未解决;
  • 将OwlTree代码移入/移出程序集定义,无变化;
  • 把OwlTree命名空间下的类型移出命名空间,错误消失;
  • 生成器在编辑器语言服务及Unity外的测试项目中正常工作,仅在Unity内出现问题;
  • 切换生成器DLL的自动引用和验证引用选项,无效果;
  • 确认Unity项目的csproj已将DLL作为分析器引入,但未包含<EnableSourceGenerators>true</EnableSourceGenerators>。

生成器csproj配置

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <LangVersion>9.0</LangVersion>
    <TargetFramework>netstandard2.0</TargetFramework>
    <IsPackable>false</IsPackable>
    <ImplicitUsings>disable</ImplicitUsings>
    <Nullable>disable</Nullable>
    <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
    <IsRoslynComponent>true</IsRoslynComponent>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference ExcludeAssets="runtime" Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3" PrivateAssets="all">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference ExcludeAssets="runtime" Include="Microsoft.CodeAnalysis.CSharp" Version="4.3.0" PrivateAssets="all" />
    <PackageReference ExcludeAssets="runtime" Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.3.0" />
  </ItemGroup>

  <ItemGroup>
    <None Include="$(OutputPath)\netstandard2.0\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
  </ItemGroup>

</Project>

更新信息

更新1:测试类验证

创建测试类:

namespace OwlTree
{
    // 将由源码生成器生成代理
    public class Test : NetworkObject
    {

    }
}

生成的ProjectProxyFactory.g.cs中引用OwlTree.Test无错误,但引用OwlTree.ProxyFactory仍报错,而ProxyFactory的定义文件与测试文件均为Assets下的普通CS文件,情况异常。

更新2:Assets文件夹结构

> Assets
    > Framework
        > OwlTree
            > OwlTree源码
        > OwlTree.Generator
            > 生成器dll
    > 上述测试类文件

更新3:问题定位与解决

最终发现问题根源:生成器被Unity应用到了主项目之外的其他两个项目中(Unity的预期行为),导致为未包含OwlTree代码的项目生成了空的代理工厂,从而引发命名空间找不到的错误。

解决方案:

  • 修改源码生成器逻辑,仅当检测到需要生成代理的类时才创建代理工厂类;
  • 在框架中添加默认逻辑,处理不存在代理工厂的场景。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:13:14