Unity 接入
安装客户端 SDK
完整集成教程(官方):Unity SDK · Getting Started
官方文档索引(引擎 + Colyseus)
| 说明 | 链接 |
|---|---|
| Unity 安装包、示例与 Schema 代码生成 | Getting Started · Unity |
| 认证体系总览 | Authentication |
| 房间侧鉴权概念(与自定义校验对照) | Room Authentication |
| 本项目 JWT 如何进房 | JWT 与房间鉴权 |
接入方式建议
- 推荐:使用 Colyseus 官方 Unity SDK,与下方示例一致,通过
Dictionary<string, object>传入token。 - 不推荐:自行用裸 WebSocket 模拟 Colyseus 协议;除非服务端改为纯自定义 JSON 网关。
示例代码(HTTP 登录 + 带 JWT 进房)
依赖:Colyseus 客户端包(见官方安装)。HTTP 使用 UnityWebRequest;JSON 解析下面用 字符串键 读取 data.tokens.accessToken(避免为登录响应单独建一堆 [Serializable] 类型)。若项目已引用 Newtonsoft.Json,可改为 JObject.Parse 更清晰。
将脚本挂到任意 GameObject,在 Inspector 中填写 wsHost、账号密码后运行。
(客户端代码)
csharp
using System;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.Networking;
using Colyseus;
using Colyseus.Schema;
public class ColyseusAuthExample : MonoBehaviour
{
[SerializeField] string wsHost = "localhost";
[SerializeField] int wsPort = 2567;
[SerializeField] bool useSSL = false;
[SerializeField] string apiPrefix = "/api";
[SerializeField] string loginUsername = "";
[SerializeField] string loginPassword = "";
Colyseus.Client _client;
/** 未做 Schema 代码生成时可用 DynamicSchema;上线建议生成 MyRoomState 并替换泛型 */
Colyseus.Room<DynamicSchema> _room;
async void Start()
{
var scheme = useSSL ? "wss" : "ws";
var portSuffix = (useSSL && wsPort == 443) || (!useSSL && wsPort == 80) ? "" : $":{wsPort}";
_client = new Colyseus.Client($"{scheme}://{wsHost}{portSuffix}");
var httpScheme = useSSL ? "https" : "http";
var loginUrl = $"{httpScheme}://{wsHost}:{wsPort}{apiPrefix}/auth/login";
var accessToken = await LoginAndGetAccessToken(loginUrl, loginUsername, loginPassword);
if (string.IsNullOrEmpty(accessToken))
{
Debug.LogError("登录失败,未拿到 accessToken");
return;
}
var options = new System.Collections.Generic.Dictionary<string, object>
{
{ "token", accessToken }
};
try
{
_room = await _client.JoinOrCreate<DynamicSchema>("my_room", options);
Debug.Log("已进房 sessionId=" + _room.SessionId);
_room.OnMessage<string>("chat", msg => Debug.Log("chat: " + msg));
_room.Send("chat", "hello from Unity");
}
catch (Exception e)
{
Debug.LogError("进房失败: " + e.Message);
}
}
static async System.Threading.Tasks.Task<string> LoginAndGetAccessToken(string url, string user, string pass)
{
var body = $"{{\"username\":\"{EscapeJson(user)}\",\"password\":\"{EscapeJson(pass)}\"}}";
using var req = new UnityWebRequest(url, "POST");
req.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(body));
req.downloadHandler = new DownloadHandlerBuffer();
req.SetRequestHeader("Content-Type", "application/json");
var op = req.SendWebRequest();
while (!op.isDone) await System.Threading.Tasks.Task.Yield();
if (req.result != UnityWebRequest.Result.Success)
{
Debug.LogError(req.error);
return null;
}
var json = req.downloadHandler.text;
// 简单匹配 "accessToken":"..."(生产环境建议换 Newtonsoft / System.Text.Json)
var m = Regex.Match(json, "\"accessToken\"\\s*:\\s*\"([^\"]+)\"");
return m.Success ? m.Groups[1].Value : null;
}
static string EscapeJson(string s) =>
(s ?? "").Replace("\\", "\\\\").Replace("\"", "\\\"");
async void OnDestroy()
{
if (_room != null)
await _room.Leave();
}
}说明:
- 示例使用
DynamicSchema便于先跑通;与服务器MyRoomState对齐后,请按官方文档做 Schema Codegen 并改为JoinOrCreate<MyRoomState>。 - 进房字典键使用
token即可(同accessToken,见 JWT 与房间鉴权)。 MyRoomState/Player字段说明 与生成后的OnAdd/OnChange监听示例见 状态同步(Schema)。
最小接入目标
- 通过 HTTP 登录拿到 JWT
- 连接 Colyseus
JoinOrCreate传入 options- 收发消息并处理断线重连