游戏开发 - 我如何将'命令行参数'传递给Unity独立版本?

时间:2016-10-04 01:51:45

标签: c# wpf unity3d command-line command-line-arguments

Standalone / Client / Exe / Player / Build都是指最终用户用来运行游戏的可执行文件。

我正在使用Unity作为我的环境选择。我正在创建一个启动游戏的启动器。这听起来非常多余,因为Unity有一个“启动器”窗口,用于它们的独立构建,但是这个目的是通过检查服务器上的最新版本来确保游戏是最新的。我使用简单的WPF应用程序构建了客户端。在这一点上,我正在考虑我的各种选项,以确保游戏的可执行文件从启动器开始。但是,Unity的独立构建只接受一些参数。这是我正在考虑的事情:

  • 将可执行文件隐藏为两个单独的不可执行文件,这些文件在命令行中使用copy /b临时组合,并作为exe输出(然后在启动后删除)。 exe不超过17mb,所以不应该花太长时间。
  • 找到一些方法来修改.exe以检查要传递的特定命令行参数(Unity的运行时不允许开发人员在构建之后访问参数。'安全问题'???)< / LI>
  • 创建一个临时文件,该文件存储时间戳或某个唯一标识符,独立游戏将检查该文件以确保它从启动器启动(只有问题是为Windows捕获错误会说'你必须启动游戏来自发射器。'或类似的东西)

我真的想使用这个启动器,因为:

  • 它将确保玩家的游戏更新,因此他们无法欺骗/利用
  • 允许使用小型5-10mb发射器安装游戏,而不是下载整个游戏
  • 很酷

如果您有任何其他建议,或者可能以正确的方式指导我,请告诉我。谢谢。

3 个答案:

答案 0 :(得分:4)

在这里回答: http://answers.unity3d.com/questions/366195/parameters-at-startup.html

从这里开始: https://effectiveunity.com/articles/making-most-of-unitys-command-line/

// Helper function for getting the command line arguments
private static string GetArg(string name)
{
    var args = System.Environment.GetCommandLineArgs();
    for (int i = 0; i < args.Length; i++)
    {
        if (args[i] == name && args.Length > i + 1)
        {
            return args[i + 1];
        }
    }
    return null;
}

您可以使用System.Environment.GetCommandLineArgs()来访问Unity版本中的命令行参数。

答案 1 :(得分:0)

不是确切的答案,但是我最近的项目也需要启动器。 因此,我在启动器应用程序和游戏之间设计了自己的通信系统。
当我们打开启动器(一个C#Windows Forms应用程序,看起来像一个Bethesda游戏启动器)时,它开始监听特定的端口(例如23076 TCP)。然后,当我们打开游戏时,它将连接到启动器服务器,启动器将向游戏发送一些数据,例如:启动器正在运行吗?选择的分辨率,选择的质量,选择的语言,控件设置等
因此,我们只需在启动器中设置选项,然后通过TCP连接将其发送到游戏即可。

答案 2 :(得分:-1)

Unity附带command line工具。

  

通常通过从桌面双击其图标来启动Unity。但是,也可以从命令行(从macOS终端或Windows命令提示符)运行它。以这种方式启动时,Unity可以在启动时接收命令和信息,这对于测试套件,自动构建和其他生产任务非常有用。

您可能特别关注的一个特殊论点是:

  

-batchmode以批处理模式运行Unity。这应始终与其他命令行参数一起使用,因为它确保不会出现弹出窗口,并且无需任何人为干预。如果在执行脚本代码期间发生异常,资产服务器更新失败,或其他失败的操作,Unity会立即退出并返回代码1。

请注意,在批处理模式下,Unity会将其日志输出的最小版本发送到控制台。但是,日志文件仍包含完整的日志信息。不支持在编辑器打开相同项目时以批处理模式打开项目;只有一个Unity实例可以一次运行