You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:

  1. 将ActivityManager和Activity设为类成员变量,只初始化一次
  2. 记录游戏数据的上一次值,仅当数据变化时触发更新
  3. 新增清理逻辑,避免内存泄漏

修改后的代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:51:21