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

Unity安卓平台SignalR客户端无法接收服务器响应求助

Unity SignalR安卓端无法接收特定消息的解决方案

针对编辑器运行正常、安卓设备能接收Hello消息但收不到SigninResponse/SignupResponse的问题,可按以下步骤排查修复:

安卓IL2CPP编译会自动裁剪未被直接引用的代码,SignalR的序列化类型(比如你的User类)很可能被误删。确保Assets目录下的link.xml中保留相关类型:

<linker>
  <!-- 保留SignalR核心依赖 -->
  <assembly fullname="Microsoft.AspNetCore.SignalR.Client" preserve="all"/>
  <assembly fullname="Microsoft.AspNetCore.SignalR.Protocols.Json" preserve="all"/>
  
  <!-- 保留自定义的User类(替换为你的实际命名空间) -->
  <type fullname="YourNamespace.User" preserve="all"/>
</linker>

2. 确认User类的序列化兼容性

确保User类符合SignalR的序列化要求:

  • 添加[Serializable]属性,或使用Newtonsoft.Json的[JsonProperty]标记字段(如果SignalR采用Json协议):
using System;

[Serializable]
public class User
{
    public string Id { get; set; }
    public string Username { get; set; }
    // 其他业务字段...
}

3. 启用SignalR调试日志定位异常

在HubConnection构建时添加日志配置,查看安卓端的日志输出,排查反序列化或消息接收的异常:

_hub = new HubConnectionBuilder()
    .WithUrl(_configs.FullUrl)
    .WithAutomaticReconnect(new ReconnectPolicy())
    .WithLogging(logging => 
    {
        logging.SetMinimumLevel(LogLevel.Debug);
        logging.AddProvider(new UnitySignalRLogger()); // 自定义日志转发到Unity控制台
    })
    .Build();

(自定义UnitySignalRLogger可将SignalR日志转输出到Unity的Debug.Log,方便在安卓日志中查看细节)

4. 检查消息名称的大小写匹配

SignalR对消息名称的大小写敏感,确认服务器发送的消息名称和客户端监听的完全一致。比如服务器若发送SignInResponse,客户端监听SigninResponse则无法接收。

5. 确保回调逻辑在Unity主线程执行

复杂对象的回调可能因线程问题导致Debug.Log不显示,可将回调逻辑转到Unity主线程:

_hub.On<User>("SigninResponse", (user) =>
{
    // 用主线程调度工具将操作转到Unity主线程
    UnityMainThreadDispatcher.Instance.Enqueue(() => 
    {
        Debug.Log("收到SigninResponse");
        SigninResponse(user);
    });
});

(UnityMainThreadDispatcher是Unity常用的主线程调度工具,可自行实现或使用现成的开源实现)

内容的提问来源于stack exchange,提问作者Shahab.D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:32:52