如何在Unity中实时更新Discord Rich Presence?
Discord Rich Presence实时更新导致Unity崩溃的解决方法
问题说明
原代码仅在Start方法中初始化并更新一次Discord Rich Presence,无法实时同步游戏内的击杀数和等级。尝试将更新逻辑移到Update每帧执行时,Unity编辑器直接崩溃——原因是每帧频繁创建ActivityManager和Activity实例,导致SDK调用过载或内存泄漏。
原代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DiscordController : MonoBehaviour { public Discord.Discord discord; void Start() { discord = new Discord.Discord(1009014665801633815, (System.UInt64)Discord.CreateFlags.Default); var activityManager = discord.GetActivityManager(); var activity = new Discord.Activity() { Details = "Score: " + ScoreScript.instance.kills, State = "Level: " + PlayerScript.Instance.level, Assets = new Discord.ActivityAssets() { LargeImage = "pocpocpoc" }, }; activityManager.UpdateActivity(activity, (res) => { if (res == Discord.Result.Ok) { Debug.Log("up an running my guy"); } else { Debug.Log("nope"); } }); } void Update() { discord.RunCallbacks(); } }
解决方案
核心思路是减少不必要的SDK对象创建和API调用,仅在数据变化时更新Rich Presence:
- 将
ActivityManager和Activity设为类成员变量,只初始化一次 - 记录游戏数据的上一次值,仅当数据变化时触发更新
- 新增清理逻辑,避免内存泄漏
修改后的代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DiscordController : MonoBehaviour { private Discord.Discord discord; private Discord.ActivityManager activityManager; private Discord.Activity currentActivity; private int lastKills; private int lastLevel; void Start() { discord = new Discord.Discord(1009014665801633815, (System.UInt64)Discord.CreateFlags.Default); activityManager = discord.GetActivityManager(); // 初始化基础活动配置 currentActivity = new Discord.Activity() { Assets = new Discord.ActivityAssets() { LargeImage = "pocpocpoc" } }; // 记录初始数值 lastKills = ScoreScript.instance.kills; lastLevel = PlayerScript.Instance.level; // 首次更新Rich Presence UpdateRichPresence(); } void Update() { discord.RunCallbacks(); // 仅当击杀数或等级变化时,才更新Rich Presence if (ScoreScript.instance.kills != lastKills || PlayerScript.Instance.level != lastLevel) { lastKills = ScoreScript.instance.kills; lastLevel = PlayerScript.Instance.level; UpdateRichPresence(); } } private void UpdateRichPresence() { // 更新动态字段 currentActivity.Details = $"Score: {lastKills}"; currentActivity.State = $"Level: {lastLevel}"; activityManager.UpdateActivity(currentActivity, (res) => { if (res == Discord.Result.Ok) { Debug.Log("Rich Presence 更新成功"); } else { Debug.Log($"Rich Presence 更新失败: {res}"); } }); } void OnDestroy() { // 销毁Discord实例,防止内存泄漏 discord?.Dispose(); } }
关键修改点
- 复用
ActivityManager和Activity实例,避免每帧创建新对象导致的资源过载 - 通过对比
lastKills和lastLevel,仅在游戏数据变化时调用Discord API,符合API调用频率限制 - 新增
OnDestroy方法释放Discord资源,避免编辑器内存泄漏
内容的提问来源于stack exchange,提问作者Vladutzu27
相关产品推荐
相关产品推荐

