Unity 2022.1打包后检测Discord运行状态失效如何解决
原检测逻辑失效原因
你之前通过匹配Process对象转字符串得到的"System.Diagnostics.Process (Discord)"结果判断进程是否存在,是打包后失效的核心原因:
Process.ToString()的输出格式没有统一规范,在Unity编辑器的Mono运行时、打包后的Mono/IL2CPP后端下返回结果可能不一致,直接导致字符串匹配失败。- 逻辑没有覆盖Discord的其他官方分支:PTB测试版、Canary金丝雀版、Development开发版的进程名分别为
DiscordPTB、DiscordCanary、DiscordDevelopment,这些版本都支持Rich Presence,原逻辑会直接漏判。
原方案修复方式
放弃字符串匹配ToString()结果的写法,直接读取进程对象的ProcessName属性判断,这个属性在所有Unity脚本后端下返回值稳定,同时覆盖所有Discord分支进程,参考代码:
using System.Diagnostics; using System.Linq; private static readonly string[] DiscordProcessNames = new[] { "Discord", "DiscordPTB", "DiscordCanary", "DiscordDevelopment" }; public static bool CheckDiscordRunning() { return Process.GetProcesses().Any(p => DiscordProcessNames.Contains(p.ProcessName)); }
这个写法在编辑器和Windows打包后都能正常生效,不需要额外系统权限。
更可靠的替代检测方案
进程检测存在误判可能(比如进程残留但实际已退出、进程名被修改),以下两种方案稳定性更高:
- 检测Discord IPC管道
Discord启动后会创建编号0-9的本地命名管道用于Rich Presence等功能的通信,直接尝试连接这些管道,连接成功就说明Discord可用,这个判断和SDK实际通信逻辑完全一致,准确率最高。参考代码:
注意不要在主线程同步跑这个检测,避免超时导致帧卡顿。using System.IO.Pipes; public static bool CheckDiscordAvailable() { // 最多检测10个IPC管道,覆盖多开、测试分支场景 for (int i = 0; i < 10; i++) { try { using var pipe = new NamedPipeClientStream(".", $"discord-ipc-{i}", PipeDirection.InOut); pipe.Connect(100); // 100ms超时避免卡主线程 return true; } catch { continue; } } return false; } - 直接依赖SDK返回值,取消前置检测
如果你用的是官方Discord Game SDK,初始化时传入CreateFlags.NoRequireDiscord标志,就会禁用自动拉起Discord、Discord未运行时崩溃的问题。初始化后通过返回的Result码判断是否成功,如果返回NotRunning/NotInstalled就跳过Rich Presence相关逻辑即可,不需要自己提前做检测。如果是用第三方开源DiscordRPC库,把初始化参数里的autoStart设为false就能达到同样效果。
额外建议
不要只在游戏启动时做一次检测,建议在后台协程里每隔30-60秒轮询一次状态,适配用户在游戏运行中开关Discord的场景,动态初始化/销毁Rich Presence实例即可。
内容的提问来源于stack exchange,提问作者peq42
相关产品推荐
相关产品推荐

