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

问题描述 投票:5回答:3

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

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

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

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

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

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

c# wpf unity3d command-line command-line-arguments
3个回答
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构建中的命令行参数。


0
投票

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


-1
投票

Unity附带了command line工具。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.