tsc*_*zle 1 c# unity-game-engine
当从命令行运行 .exe 时,我想指定我的 Unity 游戏在哪个监视器(1?2?...)上打开。
由于在统一的答案看到张贴在这里,这个C#代码所做的工作:
PlayerPrefs.SetInt("UnitySelectMonitor", 1); // Select monitor 2
Run Code Online (Sandbox Code Playgroud)
但是,设置不会生效,直到您关闭游戏并重新打开它。(这个缺陷在那个帖子中也得到了承认。)
有没有办法在第一次尝试时在所需的显示器上打开游戏?
(注意:我假设解决方案需要在构建步骤或启动 Unity Player 的 .exe 的命令行参数中。因为如果解决方案在 C# 代码本身中,如上述解决方案一样,那么游戏将已经开放,然后为时已晚。)
自 2019.3 版起,请使用-monitor 命令行参数。例如,:
GameExecutable.exe -screen-fullscreen 1 -monitor 2
Run Code Online (Sandbox Code Playgroud)
在 Unity > 2019.3.0b12、2020.1.0a12 版本中,修复了有关同时运行同一应用程序的多个实例的相关错误。从错误跟踪器:
重要提示:“适配器”命令行参数已在 2019.3 中替换为“监视器”(为了跨桌面平台的一致性);行为完全相同。
注意:此问题也会出现在其他“屏幕”命令行参数中:屏幕宽度、屏幕高度和屏幕全屏,这些也由修复程序解决。
问题是因为这些命令行参数将设置/更新 PlayerPrefs,即这些值被持久化并在应用程序下次启动时应用。因此,应用程序的第二个实例本质上“继承”了第一个进程的值,导致它由于 PlayerPrefs 更新逻辑的竞争条件而忽略它自己的命令行参数。但是,如果第二个进程延迟几秒钟,则不会发生竞争条件并且命令参数正常工作。
该修复通过在传入这些参数时设置“覆盖”值来解决竞争条件,强制运行时应用命令行值并忽略存储在 PlayerPrefs 中的值。
但是, PlayerPrefs 由命令参数更新,这仍然是一个竞争条件,并且不能保证实际保存哪些值。也就是说,应用程序的第一个实例中的值可能会保存到 PlayerPrefs 中,而不是您所期望的第二个实例中的值。Unity 无法解决这个问题,因为竞争发生在运行时外部,因此如果 PlayerPrefs 的最终状态很重要,那么您必须错开启动应用程序的每个实例。