c# - 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 的新手,所以任何明显的解决方案都可能是正确的。
提前感谢您的任何指导!
解决方案
您不能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 编译(特别参见为编辑器代码创建程序集)
推荐阅读
- ansible - 在 Ansible 任务中动态输出 YAML 列表
- excel - 是否有简单的“hello world”示例 Office 365 Excel 加载项指南?
- r - R:如何识别按ID分组的变量的特定值的第一次出现
- postgresql - 同一磁盘上的索引表空间对性能有多大影响?
- reporting-services - 更改导出 SSRS 时的默认文件名
- python - Python中的PageRank:超出最大递归深度
- lua - 这里有什么问题?'结束'预计在'附近'
' - azure - Azure Signalr - 服务器连接增加了低谷时间
- java - 从 Java 对象中提取整数值
- javascript - 无法将反应应用程序部署到 gitlab 页面