如何通过指定场景名称的命令行构建 Unity WebGl?

How to build Unity WebGl via command line specifying Scene name?

我有一个带有一些场景的 WebGl Unity 应用程序。 我需要为每个场景做一个构建,假设 SceneA、SceneB、SceneC...

所以,为了构建我写道:

"C:\Program Files\Unity\Editor\Unity.exe" -buildTarget WebGL ... SceneName ?

问题是:

谢谢

请问命令行构建时如何指定使用哪些场景?如果是这样,这就是我的处理方式。

对于你的第一个问题,

How to specify SceneName ?

我不知道您是否可以在命令行中直接指定场景名称,但是您可以 运行 使用命令行的特定功能,可以更改为项目构建的场景。

这是您需要的片段,但可以根据您的用例进行更改

using UnityEditor;
class MyEditorScript
{
     static void PerformBuild ()
     {
         string[] scenes = { "Assets/MyScene.unity" };
         BuildPipeline.BuildPlayer(scenes, ...);
     }
}

上面的代码片段非常简单,您直接指定每个场景,然后将其添加到您的构建设置中。您可以传入参数以获得不同的结果或创建多个函数,以最适合您的方式为准。下面是如何在命令行中调用此函数

"C:\Program Files\Unity\Editor\Unity.exe" -batchmode -executeMethod MyEditorScript.PerformBuild

我在这里使用 -batchmode,这样如果出现任何提示,Unity 会将它们静音,这样流程就可以更加自动化。

关于你的第二个问题,

And how to specify destination directory ?

我不确定你是否想把你保存的目录和你构建的场景联系起来,但这可能会让一切变得更容易。有一个名为 BuildPlayerOptions.locationPathName 的构建设置,它允许您指定保存构建的位置

static void WebGLProductionBuild()
{
    // Build the player.\
    BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
    buildPlayerOptions.scenes = new[] { "Assets/Scene1.unity", "Assets/Scene2.unity" };
    buildPlayerOptions.locationPathName = "yourLocationNameHere";
    buildPlayerOptions.target = BuildTarget.WebGL;
    buildPlayerOptions.options = BuildOptions.None; // set whatever you want here
    BuildPipeline.BuildPlayer(buildPlayerOptions);  // apply the setting changes
}

调用上面的方法除了函数调用和上面那行完全一样

"C:\Program Files\Unity\Editor\Unity.exe" -batchmode -executeMethod MyEditorScript.WebGLProductionBuild

我不相信你想要实现的目标可以完全从命令行完成,但这个答案非常接近。我也不确定你是否想要将场景和新路径捆绑在一起。如果您希望构建每个单独的场景并指定新路径,您可以通过使用 switch 语句创建一个新函数或只调用多个函数来实现。

Unity 已经提供了类似问题的答案 here

您可以创建一种方法来进行构建验证、更改设置和构建不同的播放器。这些方法必须位于编辑器文件夹中的脚本文件中,例如 Assets/Editor/Builders/Builder.cs。 class 也不需要扩展任何 Unity class - 唯一的要求是使用静态函数。

using UnityEditor;
using System;

class Builder
{
    static void Build ()
    {
        string[] arguments = Environment.GetCommandLineArgs();
        // ... your code here, validations, flag changes, etc.
        // foreach(string arg in arguments)
        // Filter...
        
        string sceneName = argument[1];
        string destinationDirectoryPath = arguments[2];
        

        // Build the player.\
        BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
        buildPlayerOptions.scenes = new[] { sceneName };
        buildPlayerOptions.locationPathName = destinationDirectoryPath;
        //buildPlayerOptions.target = "Your Target";
        BuildPipeline.BuildPlayer(buildPlayerOptions);

    }
}

然后您可以使用以下命令调用生成器函数:

  • /Path/To/Unity -batchmode -executeMethod Builder.Build 场景名称 目的地目录路径