Unity 命令行——如何在没有 -quit(ing) 的情况下为每个命令访问现有实例

雅科夫5777

我能够成功地从命令行运行基本的 Unity 编辑器功能,命令如下:

"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# 文件放在“资产/编辑器”文件夹中),无论是在 Unity 编辑器中将它作为 MenuItem 运行时,还是在我从命令行调用命令时。

问题:

我希望能够从 Unity 编辑器调用多个命令(例如,在检查日志文件已完成一个命令之后)。目前,要做到这一点,我需要为每个命令行调用添加 -quit 参数,这会退出整个统一实例,然后当我想运行一个新命令时,它必须重新启动统一,这可能如果我运行很多命令,需要花费很多时间。

我怎样才能简单地访问在批处理模式下运行的已经运行的统一实例,或者即使它在编辑器中打开?意思是,当我取出 -quit 参数时,该命令仍然有效,但很明显 Unity 仍在运行(正如我从任务管理器中看到的,并且当我再次尝试运行该命令时,我在记录 Unity 已经在运行当前项目),很明显,当实际的 Unity 编辑器在项目打开的情况下运行时,日志会给出另一个 Unity 实例正在与该项目一起运行的错误等...

那么有没有一种方法可以简单地获取与所需项目一起运行的当前 Unity 实例,然后从中运行一个命令,或者每次我想从命令行运行命令时必须重新启动 Unity?

雨果

也许不完全是您所追求的-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您还可以控制是否应该在前一件事失败的情况下完成第二件事。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在没有cURL命令行的情况下安装Composer?

如何在命令行上没有Gradle的情况下构建Android APK?

如何在没有命令行参数的情况下检查并引发错误

如何在Unity中从命令行更改桌面背景?

在Elm 0.18中如何在没有elm-test的情况下执行命令行断言?

如何在没有X会话的情况下通过命令行编辑KDE暂停设置?

在没有Node.js的情况下,如何在命令行上使用npm工具?

如何在没有 sed 的情况下从命令行替换(PHP)文件中的电子邮件?

如何在没有用户干预的情况下从命令行静默卸载软件?

如何在没有节点的命令行上执行javascript

如何在没有数字键盘(也没有鼠标滚轮)的情况下放大/缩小 emacs -nw(仅限命令行)?

如何在没有命令行参数的情况下提供带有代码内部参数的 python argparse.parser?

如何在没有DROP数据库权限的情况下从命令行删除所有MySQL表?

如何在没有用户交互的情况下在一个命令行中从 FTP 站点下载文件 (Windows)

如何从命令行学习将在Unity的“系统设置”中启动应用程序的命令?

如何在没有软件包的 Windows 上从命令行运行 Junit 测试?

如何仅在Windows命令行中没有路径的情况下获取文件名?

如何在隐身模式下通过带有URL的命令行通过命令行打开Google Chrome?

如何在Windows的命令行中杀死所有无头Chrome实例?

Unity3D。试图在没有权限的情况下发送命令给对象

如何在命令行中捕获所有访问的URL?

在没有脚本文件的情况下从命令行执行python程序

在没有GUI的情况下从命令行运行JavaFX应用

在没有秘密密钥的情况下从命令行指控S3

在没有命令行cURL的情况下在solr中计数不相同

在没有 Maven 码头的情况下从命令行运行战争

在没有命令行的情况下使 Node.js ftp-srv 只读

如何在不访问命令行的情况下更改远程服务器上的文件/文件夹所有权?

如何在命令行中使用-a?