Skip to content

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)

最小接入目标

  1. 通过 HTTP 登录拿到 JWT
  2. 连接 Colyseus
  3. JoinOrCreate 传入 options
  4. 收发消息并处理断线重连