每次我重新加载项目时,统一的 Csproj 文件都会更改

Csproj file in unity changes everytime i reload the project

我想更改我的统一项目的 'csproj' 文件,以便能够按照 this 回答建议访问特定库。

我正在手动编辑文件,但每次我重新加载项目时,'csproj' 文件 returns 都会恢复到初始状态。

这是一个常见问题吗?有没有办法避免这种情况并永久更改文件?


编辑:我的目标是使用 CSharpCodeProvider 所以如果有另一种方法可以不改变 'csproj' 文件,我会很乐意采用这种方法

据我所知,您无法阻止 Unity 在重新编译您的脚本时覆盖您的 csproj 文件。

在使用较大的代码库和 Unity3D 时,我倾向于将大部分代码放入单独的 .Net 程序集 (DLL) 中。当我在多个项目和游戏服务器之间共享代码时,这对我很有帮助,而且 Unity 在检测到更改时不需要编译所有脚本。

为此启动您选择的 .Net IDE 并创建一个新的 class 库 项目(它将输出一个 .dll)。确保它针对 .Net Framework 3.5 或更低版本。然后,在 post-build 步骤中将输出的 .dll 复制到 Unity 项目的 Assets 文件夹中。我喜欢使用 post-build 步骤来防止我在更改后忘记复制程序集。

Unity 在创建 C# 项目时会自动引用项目 Assets 文件夹中的 DLL。这意味着所有包含的代码都可以在您的脚本中使用。但请注意,反之则不会那么容易:您不能在单独的项目中使用来自 Unity 脚本的代码。

根据您想用 CSharpCodeProvider 做什么,您可以将生成逻辑(和必要的 Import 指令)放入这样一个单独的项目中。

编辑:有关我们如何设置项目结构的更多信息,您可以在 Unite11 的 Jagged Alliance Online 上观看首席程序员的 this talk

正如 Suigi 所建议的,我在 .Net IDE (SharpDevelop) 的帮助下创建了一个 .dll 文件,并将其复制到 unity 的 'Assets' 文件夹中。

(How do i create a .dll file with SharpDevelop)

这是我为生成 .dll 文件而编写的 class:

using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
using System.Diagnostics;
using Microsoft.CSharp;
using System.Reflection;

namespace dllTest {

public class AssemblyGeneration {

    public static Assembly generateAssemblyFromCode(string code, string assemblyFilename) {
        CSharpCodeProvider codeProvider = new CSharpCodeProvider();
        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        parameters.GenerateExecutable = false;
        parameters.OutputAssembly = assemblyFilename + ".dll";
        CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, code);

        Assembly assembly = null;
        if (!results.Errors.HasErrors) {
            assembly = results.CompiledAssembly;
            return assembly;
        }
        else {
            return null;
        }
    }
}
}

为了在任何统一脚本中使用它,只需使用命名空间 'dllTest'。然后,您可以调用 AssemblyGeneration.generateAssemblyFromCode(...) .

为了完整起见:

Unity 中有一个未记录的功能,它允许您使用 AssetPostprocessor:

编辑生成的 .csproj 文件(以编程方式)

Assets 下任何名为 Editor 的文件夹中,创建具有以下结构的 class:

public class CsprojPostprocessor : AssetPostprocessor {
        public static string OnGeneratedCSProject(string path, string content) {
            return PatchCsprojContent(content);
        }
    }

其中 PathCsprojContent 是一个函数 returns .csproj 文件的补丁版本,添加了您需要的内容。

如果您只想修补某些.csproj 个文件,您可以事先检查路径。例如,如果您只想处理名为 Assembly-CSharp.csproj 的资产 .csproj 文件,则可以将以下检查添加到 OnGeneratedCsProject 的开头:

if (!path.EndsWith("Assembly-CSharp.csproj")) {
    return content;
}

参考:https://docs.microsoft.com/en-us/visualstudio/gamedev/unity/extensibility/customize-project-files-created-by-vstu