Home > Enterprise >  Build Unity Server under ubuntu via command line
Build Unity Server under ubuntu via command line

Time:10-01

I created a very simple Unity Server, which uses a simple script (taken from here). I tried to build it through the ubuntu bash with the following command:

~/Unity/Hub/Editor/2019.4.30f1/Editor/Unity -batchmode -nographics -logfile stdout.log -projectPath /path/to/the/project -buildLinux64Player /project/build/destination -quit

And it worked! It's able to create a working build. The problem is that the 3D windows is displayed as well. I don't want to interact with any game object. Is there a way to create or run the executable without GUI? As you can see I used "batchmode" and "nographics" flags which were supposed to prevent the user interface to appear.

Which sort of mistake I have done? Thanks for your time.

CodePudding user response:

As you can see I used "batchmode" and "nographics" flags which were supposed to prevent the user interface to appear.

yes and it didn't!

However, these two flags only apply to this instance of the UnityEditor which performs the build ... they do not apply to the actual resulting built application ;)


Usually you would go to the BuildSettings and enable

Server Build
Enable this checkbox to build the Player for server use and with no visual elements (headless) without the need for any command line options. When you enable this option, Unity builds managed scripts with the UNITY_SERVER define, which means you can write server-specific code for your applications. You can also build to the Windows version as a console app so that stdin and stdout are accessible. Unity logs go to stdout by default.

under CommandLine Arguments you can find for how to trigger a scripted build via the console. Instead of using -buildXYZ you could use -executeMethod and within that method define the exact player and build settings you want before starting the build process

#if UNITY_EDITOR
using System;
using System.IO;

using UnityEditor;

using UnityEngine;

class ScriptedBuilds
{
    // Invoked via command line only
    static void PerformHeadlessLinuxBuild()
    {
        // As a fallback use <project root>/BUILD as output path
        var buildPath = Path.Combine(Application.dataPath, "BUILD");

        // read in command line arguments e.g. add "-buildPath some/Path" if you want a different output path 
        var args = Environment.GetCommandLineArgs();

        for (var i = 0; i < args.Length; i  )
        {
            if (args[i] == "-buildPath")
            {
                buildPath = args[i   1];
            }
        }

        // if the output folder doesn't exist create it now
        if (!Directory.Exists(buildPath))
        {
            Directory.CreateDirectory(buildPath);
        }

        BuildPipeline.BuildPlayer(

            // Simply use the scenes from the build settings
            // see https://docs.unity3d.com/ScriptReference/EditorBuildSettings-scenes.html
            EditorBuildSettings.scenes,
            
            // pass on the output folder
            buildPath,

            // Build for Linux 64 bit
            BuildTarget.StandaloneLinux64,

            // Use Headless mode
            // see https://docs.unity3d.com/ScriptReference/BuildOptions.EnableHeadlessMode.html
            // and make the build fail for any error
            // see https://docs.unity3d.com/ScriptReference/BuildOptions.StrictMode.html
            BuildOptions.EnableHeadlessMode | BuildOptions.StrictMode
        );
    }
}
#endif

and then e.g.

~/Unity/Hub/Editor/2019.4.30f1/Editor/Unity -batchmode -nographics -logfile stdout.log -projectPath /path/to/the/project -executeMethod ScriptedBuilds.PerformHeadlessLinuxBuild -quit

or with a custom build output path

~/Unity/Hub/Editor/2019.4.30f1/Editor/Unity -batchmode -nographics -logfile stdout.log -projectPath /path/to/the/project -buildPath path/to/build/destination -executeMethod ScriptedBuilds.PerformHeadlessLinuxBuild -quit

CodePudding user response:

Maybe you could try to add the #define UNITY_SERVER directive to the top of your script. This will enable the server build and disable visual elements see 'Server Build' option in the 'Platform list' table

  • Related