首页 > 解决方案 > Unity 命令行构建需要 UnityEditor.BuildPipeline,但由于缺少“UnityEditor”参考而构建失败

问题描述

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

该项目仅包含一个在 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(片段)

...
-----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#unity3dbuildcommand-line-interface

解决方案


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


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

  • 要么使用#if预处理器包装所有使用它的东西

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

    您的链接实际上也提到了这一点 - 虽然没有很好地解释:

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

  • 或者在较新的 Unity 版本中,您可以将其放在单独的文件夹中(使用任何名称)并创建AssemblyDefinition并配置它,以便仅为 UnityEditor 编译(特别参见为编辑器代码创建程序集


推荐阅读