【问题标题】:Unity command-line build requires UnityEditor.BuildPipeline, but builds fail for missing 'UnityEditor' referenceUnity 命令行构建需要 UnityEditor.BuildPipeline,但由于缺少“UnityEditor”参考而构建失败
【发布时间】:2019-11-18 08:56:39
【问题描述】:

我目前正在尝试为一个简单的 Unity 项目的命令行构建创建一个批处理文件。
当前环境是:
* 视窗 10
* Unity 2017.4.19f1(个人版)
* 离线网络

该项目仅包含一个在 UnityEditor 中运行良好的简单场景。在未能获得良好的构建后,我将构建脚本和批处理文件精简为以下内容:

BareBoneBuild.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEditor;

namespace Assets.BuildScripts
{
    class BareBoneBuild
    {
        private static string windowsBuildFolderPath = "G:/dev/projects/SimpleProject";

        static void PerformBuild()
        {
            string[] scenes = { "Assets/Scenes/DetectionTest.cs" };
            BuildPipeline.BuildPlayer(scenes, windowsBuildFolderPath + "/junk.exe", BuildTarget.StandaloneWindows, BuildOptions.None);
        }
    }
}

BareBoneBuild.bat

title Unity Build

echo Launching Unity Build...
"C:\Program Files\Unity\Editor\Unity.exe" ^
-batchmode ^
-projectPath G:\dev\projects\SimpleProject ^
-executeMethod Assets.BuildScripts.BareBoneBuild.PerformBuild ^
-quit ^
-logFile G:\dev\projects\SimpleProject\logs\BareBoneBuild.log

echo Build Finished!

PAUSE

BareBoneBuild.log (sn-p)

...
-----CompilerOutput:-stdout--exitcode: 1--compilationhadfailure: True--outfile: Temp/Assembly-CSharp.dll
Compilation failed: 1 error(s), 0 warnings
-----CompilerOutput:-stderr----------
Assets/BuildScripts/BareBoneBuild.cs(6,7): error CS0246: The type or namespace name `UnityEditor' could not be found. Are you missing an assembly reference?
-----EndCompilerOutput---------------
- Finished compile Library/ScriptAssemblies/Assembly-CSharp.dll
Assets/BuildScripts/BareBoneBuild.cs(6,7): error CS0246: The type or namespace name `UnityEditor' could not be found. Are you missing an assembly reference?**

(Filename: Assets/BuildScripts/BareBoneBuild.cs Line: 6)

DisplayProgressNotification: Build Failed
Error building Player because scripts had compiler errors

(Filename:  Line: -1)
...

每一个教程、博客、youtube 视频、论坛
* https://docs.unity3d.com/2017.4/Documentation/Manual/CommandLineArguments.html
* http://jonathanpeppers.com/Blog/automating-unity3d-builds-with-fake
* https://www.youtube.com/watch?v=4J3SmhGxO1Y * 其他...我没有指向的链接

我已经查看了 BuildPipeline.BuildPlayer 是从命令行构建项目的方式的状态。 BuildPipeline 位于 UnityEditor 库中。

我做错了什么?我还是 Unity 的新手,所以任何明显的解决方案都可能是正确的。

提前感谢您的指导!

【问题讨论】:

    标签: c# unity3d build command-line-interface


    【解决方案1】:

    您不能在构建中使用using UnityEditor;。它被剥夺了。


    您只需要在编辑器脚本中而不是在构建中使用它:

    • 要么使用#if pre-processors 像使用它一样包装所有内容

       #if UNITY_EDITOR
           using UnityEditor;
       #endif
      
       ...
      
       #if UNITY_EDITOR
           // anything using UnityEidtor e.g. the method or entire class
       #endif
      
    • 或者在您的情况下,只需将整个脚本移动到名为 Editor 的文件夹中,该文件夹会删除整个脚本以进行构建(请参阅 Special folder names)。

      your link 实际上也提到了这一点 - 虽然没有很好地解释:

      然后您需要在 Unity 项目中在编辑器文件夹中中创建一个类,例如这个 Android 示例:

    • 或者在较新的 Unity 版本中,您可以将其放在单独的文件夹中(使用任何名称)并创建一个 AssemblyDefinition 并对其进行配置,使其仅针对 UnityEditor 进行编译(具体参见 Creating an assembly for Editor code

    【讨论】:

    • 是的!太感谢了!我现在已经编译了EXE!我很惊讶,这么多地方都忽略了这样一个小细节!特别是因为它在 Unity 官方文档中不存在!
    • 首先 - docs 有一个使用 UnityEditor 的自定义构建示例类。第二 - BuildPipeline.BuildPlayer() 在 UnityEditor 命名空间中声明,所以没有它你就不能真正构建你的项目。
    • @rostok 也许我错过了你的观点,但首先 - 是的,这很可能是 OP 的代码所基于的,因为它正是 + 使用命令行参数的批处理文件.. 和第二- 是的,但它仍然只在 UnityEditor 本身内有效,并且不会存在于应用程序的构建中 => 正如我在回答中所说,有两种方法可以确保脚本不包含在构建本身中跨度>
    • @derHugo 我错误地认为您建议从批处理访问的构建类中删除 UnityEditor。很抱歉让您感到困惑,您的回答很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2018-03-11
    • 2019-12-14
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多