Командная строка Unity - как получить доступ к существующему экземпляру без -quit (ing) для каждой команды - PullRequest
0 голосов
/ 19 февраля 2019

Я успешно могу запускать базовые функции Unity Editor из командной строки с помощью такой команды:

"C:\Program Files\Unity\Hub\Editor\2019.1.0b1\Editor\Unity"  -batchmode -quit -projectPath "C:\Users\me\OneDrive\Documents\totally empty" -executeMethod COBY.BuildIt -logfile "C:\Users\me\OneDrive\Desktop\wow.txt"

и некоторого кода на C #, например:

public class COBY : MonoBehaviour
{
    public static void BuildIt() {
        AssetBundleBuild[] assets = new AssetBundleBuild[2];

        assets[0].assetBundleName = "cobysNewBundle";
        string[] assetNames = new string[2];
        assetNames[0] = "Assets/CobyThings/teffilin.fbx";
        assetNames[1] = "Assets/CobyThings/up.fbx";
        assets[0].assetNames = assetNames;

        assets[1].assetBundleName = "anotherBundle";
        string[] notherBundleNames = new string[1];
        notherBundleNames[0] = "Assets/CobyThings/atzmusPic.png";
        assets[1].assetNames = notherBundleNames;

        var path = "Assets/m23214ycobytest.txt";
        StreamWriter writer = new StreamWriter(path, true);
        writer.WriteLine("Just wrote to these assets!");
        writer.Close();
        Debug.Log("ASDFGG");
        MonoBehaviour.print("wow");

        BuildPipeline.BuildAssetBundles("Assets/CobysAssets", assets, BuildAssetBundleOptions.None, BuildTarget.WebGL);
    }
}

который на самом деле прекрасно работает (пока я помещаю файл C # в папку «Assets / Editor»), как при запуске его как MenuItem в редакторе Unity, так и при вызове команды из командной строки.

Проблема:

Я хотел бы иметь возможность вызывать несколько команд из редактора Unity (после проверки, например, что файл журнала выполнил одну команду).В настоящее время для этого мне нужно добавить аргумент -quit для каждого вызова командной строки, который завершает весь экземпляр единицы, а затем, когда я хочу запустить новую команду, он должен снова запустить единство, что можетзаймет много времени, если я выполняю много команд.

Как я могу просто получить доступ к уже запущенному экземпляру Unity, который либо работает в пакетном режиме, или даже если он открыт в редакторе?Это означает, что когда я убираю параметр -quit, то команда все еще работает, но ясно, что Unity все еще работает (как я вижу из диспетчера задач, а также, когда я пытаюсь запустить команду снова, я получаю сообщение об ошибке врегистрировать, что Unity уже выполняет текущий проект), и, очевидно, когда фактический редактор Unity работает с открытым проектом, тогда журнал выдает ошибку, что другой экземпляр Unity запущен с этим проектом и т. д.

Итак, есть ли способ просто получить текущий экземпляр Unity, который работает с желаемым проектом, и просто запустить команду из этого, или я имею , чтобы перезапускать Unity каждый раз, когда я хочу запустить команду изкомандная строка?

1 Ответ

0 голосов
/ 19 февраля 2019

Может быть, не совсем то, что вам нужно - afaik, невозможно отправить аргументы командной строки уже запущенному процессу - но вы можете использовать один центральный вызов -executeMethod вместе с System.Environment.GetCommandLineArgs();, чтобы получить некоторые пользовательские параметры, чтобы сообщитьэтот центральный метод, что делать ... что-то вроде

public class COBY : MonoBehaviour
{
    public static void ExecuteFromExternal() 
    {
        string[] args = System.Environment.GetCommandLineArgs ();

        // maybe also add a flag to make sure a second thing is only done
        // if the one before was successfull
        bool lastSucceeded = true;
        // just in combination with the flag to know which was the last
        // command executed
        int lastI = 0;

        for (int i = 0; i < args.Length; i++) 
        {
            Debug.Log ("ARG " + i + ": " + args [i]);

            // interrupt if one command failed
            if(!lastSucceeded)
            {
                Debug.LogFormat("Last command \"{0}\" failed! -> cancel", args[lastI]);
                return;
            }

            switch(args[i])
            {
                case "-doSomething":
                    lastI = i;

                    // do something
                    lastSucceeded = wasItSuccessfull;
                    break;

                case "-build":
                    lastI = i;

                    // maybe you want to get some values after "-build"
                    // because they are needed let's say e.g. an int and a path
                    int value = args[i + 1];
                    string path = args[i + 2];
                    // maybe a sanity check here

                    // now build using that value and the path

                    // you could increase i since the next two
                    // arguments don't have to be checked
                    i += 2;
                    break;
            }
        }
    }
}

Так что теперь вы можете вызвать, например,

"C:\...\Unity" -batchmode -quit -projectPath "C:\..." -executeMethod COBY.ExecuteFromExternal -doSomething -logfile "C:\...\wow.txt"

, чтобы выполнить только первый метод или, например,

"C:\...\Unity" -batchmode -quit -projectPath "C:\..." -executeMethod COBY.ExecuteFromExternal -build 42 "C:\some\path" -logfile "C:\...\wow.txt"

только для выполнения части сборки или, например,

"C:\...\Unity" -batchmode -quit -projectPath "C:\..." -executeMethod COBY.ExecuteFromExternal -doSomething -build 42 "C:\some\path" -logfile "C:\...\wow.txt"

для выполнения обеих (в указанном порядке).


Пока вы не выполняете async там все хорошо, и второй метод не должен выполняться до того, как первый закончится.Используя флаг lastSucceeded, вы также можете контролировать, следует ли в любом случае делать вторую вещь, если предыдущая не удалась или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...