diff --git a/Brisk Package 发布流程.md b/Brisk Package 发布流程.md deleted file mode 100644 index a8e1e69..0000000 --- a/Brisk Package 发布流程.md +++ /dev/null @@ -1,110 +0,0 @@ -# Brisk Package 发布流程 - -本文档用于约定当前仓库的发布方式。 - -仓库地址: - -- `http://private.lightyears.ltd:18650/foldcc/CC-Framework.BriskGameServer.git` - -## 开发态 - -当前仓库是 Unity 原始开发工程: - -- SDK 活代码放在 `Assets/BriskSdk/Runtime` -- 示例脚本放在 `Assets/BriskSdk/Samples/QuickStart` -- 示例场景放在 `Assets/Scenes/BriskQuickStartScene.unity` - -## 发布态 - -对外发布 Git Package 时,不直接把整个 Unity 工程作为包发布。 - -统一从以下目录产出 package 内容: - -- `PackageSource/com.foldcc.cc-framework.BriskGameServer` - -该目录用于承载: - -- `package.json` -- `README.md` -- `CHANGELOG.md` -- `Documentation~` -- `Runtime` -- `Samples~` - -## 同步步骤 - -在准备发布分支或发布 tag 前,执行: - -```powershell -./Tools/Sync-BriskPackage.ps1 -``` - -脚本会自动: - -1. 从 `Assets/BriskSdk/Runtime` 同步到 `PackageSource/com.foldcc.cc-framework.BriskGameServer/Runtime` -2. 从 `Assets/BriskSdk/Samples/QuickStart` 同步到 `PackageSource/com.foldcc.cc-framework.BriskGameServer/Samples~/QuickStart` -3. 把 `Assets/Scenes/BriskQuickStartScene.unity` 一并复制到 package sample 目录 - -## 分支与 Tag 规范 - -建议采用以下命名: - -- 日常开发分支: - - `feature/...` - - `fix/...` -- 对外发包分支: - - `release/upm-vX.Y.Z` -- 对外发包 tag: - - `upm/vX.Y.Z` - -示例: - -- `release/upm-v0.1.0` -- `upm/v0.1.0` - -## 推荐发布动作 - -每次准备发版时,建议严格按以下顺序执行: - -1. 在开发分支完成 SDK 功能与测试 -2. 更新 `Assets` 下源码与示例场景 -3. 运行 `./Tools/Sync-BriskPackage.ps1` -4. 检查 `PackageSource/com.foldcc.cc-framework.BriskGameServer` 输出结果 -5. 更新 `package.json` 版本号 -6. 更新 `CHANGELOG.md` -7. 创建发布分支 `release/upm-vX.Y.Z` -8. 提交发布目录改动 -9. 打 tag `upm/vX.Y.Z` -10. 推送发布分支与 tag - -## 外部项目接入示例 - -外部项目通过 Git Package Manager 接入时,建议固定到 tag: - -```text -http://private.lightyears.ltd:18650/foldcc/CC-Framework.BriskGameServer.git?path=/PackageSource/com.foldcc.cc-framework.BriskGameServer#upm/v0.1.0 -``` - -这样做的好处: - -- 外部项目不会直接依赖整个 Unity 开发工程 -- 接入版本稳定,可回滚 -- package 内容和开发态源码解耦 - -## 当前注意事项 - -当前 `package.json` 中的包名仍然沿用既定命名: - -- `com.foldcc.cc-framework.BriskGameServer` - -这符合当前项目命名诉求,但从 UPM / npm 生态习惯看,正式大范围外发前,建议再确认一次是否需要改成全小写形式,以避免潜在兼容性问题。 - -## 建议发布流程 - -1. 在开发分支完成功能 -2. 运行 `./Tools/Sync-BriskPackage.ps1` -3. 检查 `PackageSource/com.foldcc.cc-framework.BriskGameServer` 内容 -4. 切到对外发布分支,或基于当前提交创建发布分支 -5. 只保留 package 所需目录,或以该子目录作为 git package 子路径 -6. 更新 `package.json` 版本号与 `CHANGELOG.md` -7. 打 tag 给外部项目接入 diff --git a/Brisk Unity SDK 实施计划.md b/Brisk Unity SDK 实施计划.md deleted file mode 100644 index 9561b32..0000000 --- a/Brisk Unity SDK 实施计划.md +++ /dev/null @@ -1,202 +0,0 @@ -# Brisk Unity SDK 实施计划 - -本文档用于记录 Brisk Unity SDK 的分阶段实施步骤,作为当前项目的实现路线图。 - -## 阶段 1:骨架与约束 - -目标: - -- 固定 SDK 的公开外形 -- 固定目录结构与命名 -- 建立可编译的基础代码骨架 - -范围: - -- 创建并完善 `Assets/BriskSdk/Runtime` 开发结构 -- 创建顶层入口 `Brisk` -- 创建基础对象: - - `BriskOptions` - - `BriskContext` - - `BriskSession` - - `BriskIdentity` -- 创建模块入口占位: - - `Brisk.Auth` - - `Brisk.Player` - - `Brisk.Config` - - `Brisk.Announcements` - - `Brisk.Leaderboard` - - `Brisk.Archive` - - `Brisk.Space` -- 创建基础异常与核心接口占位 -- 固定首版方法签名 -- 对齐新版后端身份模型: - - 初始化不再要求 `channel / platform` - - 登录改为 `login_provider / login_user_id / code` - -阶段完成标准: - -- Unity 工程内存在完整 SDK 运行时骨架 -- 代码可编译 -- 对外 API 入口已固定为 `Brisk.xxx` - -## 阶段 2:初始化与会话基础 - -目标: - -- 打通 SDK 生命周期入口 -- 打通 bootstrap 与本地会话恢复 - -范围: - -- 实现 `Brisk.InitializeAsync` -- 规范化 `BaseUrl` -- 调用 `GET /client/bootstrap` -- 缓存 bootstrap 结果 -- 接入本地 token 存储 -- 初始化时恢复本地会话 -- 可选调用 `player/me` 校验旧会话有效性 - -阶段完成标准: - -- SDK 能完成初始化 -- 能缓存 bootstrap 信息 -- 能恢复本地登录态 - -## 阶段 3:网络底层与严重错误处理 - -目标: - -- 打稳底层请求能力 -- 只统一接管严重错误 - -范围: - -- 实现 `BriskHttpClient` -- 实现统一 JSON 解包 -- 实现异常体系 -- 实现严重错误识别: - - 维护中 - - 封号 - - 登录态失效 -- 接入默认错误展示器 -- 支持项目方自定义严重错误展示 UI - -阶段完成标准: - -- 请求层可用 -- 严重错误可由 SDK 默认 UI 处理 -- 普通错误继续交由调用方自行处理 - -## 阶段 4:登录与玩家基础模块 - -目标: - -- 打通玩家态核心链路 - -范围: - -- 实现 `Brisk.Auth.LoginAsync` -- 或更明确地实现: - - `Brisk.Auth.LoginWithUserIdAsync` - - `Brisk.Auth.LoginWithCodeAsync` -- 实现 `Brisk.Auth.LogoutAsync` -- 实现 `Brisk.Player.GetMeAsync` -- 自动附加 Bearer Token -- 管理登录态与相关事件 - -阶段完成标准: - -- 初始化后可完成登录 -- 可获取当前玩家信息 - -## 阶段 5:首批高频业务模块 - -目标: - -- 覆盖首版最高频使用场景 - -范围: - -- `Brisk.Config` -- `Brisk.Announcements` -- `Brisk.Leaderboard` - -排行榜首版接口: - -- `GetTopAsync` -- `GetMeAsync` -- `GetAroundMeAsync` -- `SubmitScoreAsync` -- `GetCurrentSeasonAsync` -- `GetSeasonHistoryAsync` -- `GetSeasonHistoryDetailAsync` - -阶段完成标准: - -- SDK 已具备主要交付价值 -- 排行榜体验可用于首轮接入 - -## 阶段 6:差异化模块 - -目标: - -- 补齐 Brisk 的差异化能力 - -范围: - -- `Brisk.Archive` - - 槽位列表 - - 元信息 - - 上传 - - 下载 - - 版本冲突处理 - - 校验值处理 -- `Brisk.Space` - - 按 `player_id` 查询 - - 按 `login_provider + login_user_id` 查询 - - 点赞与取消点赞 - - 更新自己的空间 - - 我的访客 - -阶段完成标准: - -- 云存档和空间模块可实际使用 - -## 阶段 7:收尾与交付增强 - -目标: - -- 让 SDK 达到可交付、可接入状态 - -范围: - -- 默认本地存储实现 -- 默认错误展示 UI 完善 -- 日志开关与调试信息 -- 示例代码 -- Sample Scene -- 文档补充 -- 自测清单 - -补充约束: - -- 当前仓库作为 Unity 原始开发工程,活代码放在 `Assets/BriskSdk` -- 正式对外发包时,再从发布分支整理出 `PackageSource/com.foldcc.cc-framework.BriskGameServer` 子目录作为 UPM 包 - -阶段完成标准: - -- SDK 可以给外部开发者试接入 - -## 暂缓项 - -以下内容不阻塞首版主线: - -- 弱网模式与标准模式双策略 -- 更复杂的自动重试策略 -- 多套默认 UI 风格 -- 管理后台 SDK - -建议: - -- 首版先完成标准模式 -- 主线可用后再评估弱网模式 diff --git a/Brisk Unity SDK 快速开始.md b/Brisk Unity SDK 快速开始.md deleted file mode 100644 index 4ac7889..0000000 --- a/Brisk Unity SDK 快速开始.md +++ /dev/null @@ -1,159 +0,0 @@ -# Brisk Unity SDK 快速开始 - -本文档用于说明当前仓库内这套 Brisk Unity SDK 的最小接入方式。 - -## 1. 当前能力 - -当前 SDK 已经打通以下主链路: - -- 初始化 `Brisk.InitializeAsync` -- 本地会话恢复 -- 登录与登出 -- 玩家信息 -- 动态配置 -- 公告 -- 排行榜 -- 云存档 -- 玩家空间 - -当前主要源码位于: - -- `Assets/BriskSdk/Runtime` - -最小示例脚本位于: - -- `Assets/BriskSdk/Samples/QuickStart/BriskQuickStartSample.cs` - -## 2. 最小初始化 - -```csharp -await Brisk.InitializeAsync(new BriskOptions -{ - BaseUrl = "https://brisk.lightyears.ltd", - GameKey = "demo-game", - ClientVersion = Application.version, - DeviceId = SystemInfo.deviceUniqueIdentifier -}); -``` - -说明: - -- `BaseUrl` 必填 -- `GameKey` 必填 -- `ClientVersion` 可选但强烈建议传 -- `DeviceId` 可选但建议传 - -## 3. 登录示例 - -按稳定用户 ID 登录: - -```csharp -await Brisk.Auth.LoginWithUserIdAsync("tap", "tap_user_10001", new BriskProfile -{ - Nickname = "Player One" -}); -``` - -按 code 登录: - -```csharp -await Brisk.Auth.LoginWithCodeAsync("tap", "third-party-code"); -``` - -## 4. 常用调用示例 - -读取当前玩家: - -```csharp -var me = await Brisk.Player.GetMeAsync(); -``` - -读取动态配置: - -```csharp -var config = await Brisk.Config.GetCurrentAsync(); -``` - -读取排行榜: - -```csharp -var top = await Brisk.Leaderboard.GetTopAsync("season-score", 20); -var meRank = await Brisk.Leaderboard.GetMeAsync("season-score"); -await Brisk.Leaderboard.SubmitScoreAsync("season-score", 128); -``` - -上传云存档: - -```csharp -var bytes = System.Text.Encoding.UTF8.GetBytes("{\"save\":1}"); -await Brisk.Archive.UploadAsync(1, bytes); -``` - -读取玩家空间: - -```csharp -var space = await Brisk.Space.GetByLoginIdentityAsync("tap", "tap_user_10001"); -``` - -## 5. 默认错误 UI - -当前 SDK 已内置默认错误展示器: - -- 维护中 -- 封号 -- 登录态失效 - -如果未自定义 `ErrorPresenter`,SDK 会自动使用默认 IMGUI 弹窗进行展示。 - -如需替换: - -```csharp -Brisk.SetErrorPresenter(myPresenter); -``` - -接口为: - -```csharp -public interface IBriskErrorPresenter -{ - void ShowBlockingError(BriskBlockingException exception); - void ShowAuthExpired(BriskAuthExpiredException exception); -} -``` - -如需在阻断错误确认后执行你自己的退出逻辑: - -```csharp -await Brisk.InitializeAsync(new BriskOptions -{ - BaseUrl = "...", - GameKey = "...", - ExitHandler = () => Application.Quit() -}); -``` - -## 6. 示例脚本使用方式 - -当前项目已提供: - -- `Assets/BriskSdk/Samples/QuickStart/BriskQuickStartSample.cs` -- `Assets/Scenes/BriskQuickStartScene.unity` - -使用方式: - -1. 当前仓库是原始 Unity 开发工程,可直接打开 `Assets/Scenes/BriskQuickStartScene.unity` -2. 运行后会看到一个 IMGUI 调试面板,可直接测试初始化、登录、玩家、配置、公告、排行榜、云存档、空间等完整流程 -3. 勾选 `AutoRunOnStart` -4. 如需更换环境参数,可在 Inspector 里修改 `BaseUrl`、`GameKey`、`LoginProvider`、`LoginUserId` 等字段后再运行 - -也可以在组件右键菜单里执行: - -- `Run Brisk Sample` - -## 7. 当前实现状态 - -当前 SDK 已实现主流程,但还建议后续继续补: - -- 更细粒度的业务异常类型 -- 弱网策略 -- 更完整的接入文档与注释 diff --git a/Brisk Unity SDK 设计草案.md b/Brisk Unity SDK 设计草案.md deleted file mode 100644 index 0eeb0ce..0000000 --- a/Brisk Unity SDK 设计草案.md +++ /dev/null @@ -1,600 +0,0 @@ -# Brisk Unity SDK 设计草案 - -本文档用于沉淀当前 Brisk Unity SDK 的首版设计方向,目标是: - -- 对开发者极简易用 -- 初始化一次后,各模块可直接调用 -- 保持内部结构清晰,便于后续扩展 -- 优先围绕当前服务端已实现接口设计,不预埋过多未来能力 - -参考资料: - -- `服务参考_临时/Brisk Unity SDK接入文档.md` -- `服务参考_临时/Brisk API接口与示例文档.md` -- `服务参考_临时/Brisk 错误码文档(内部实施版).md` -- `服务参考_临时/openapi.yaml` -- TapTap 官方 Unity 集成与排行榜文档 - -## 1. 设计目标 - -首版 SDK 对外遵循以下原则: - -- 对外统一使用 `Brisk.xxx` -- 模块能力统一使用 `Brisk.模块.xxx` -- 不暴露底层 HTTP、Envelope、Token 注入等细节 -- 初始化参数只保留项目级与设备级信息 -- 登录模型统一围绕 `login_provider / login_user_id / code` -- 初始化完成后,模块可直接调用 -- 错误码统一在 SDK 内部识别和分发 - -示例目标用法: - -```csharp -await Brisk.InitializeAsync(new BriskOptions -{ - BaseUrl = "https://brisk.lightyears.ltd", - GameKey = "demo-game", - ClientVersion = Application.version, - DeviceId = SystemInfo.deviceUniqueIdentifier -}); - -await Brisk.Auth.LoginWithUserIdAsync("tap", "tap_user_10001"); - -var me = await Brisk.Player.GetMeAsync(); -var top = await Brisk.Leaderboard.GetTopAsync("season-score", 20); -await Brisk.Leaderboard.SubmitScoreAsync("season-score", 128); -``` - -## 2. 对外 API 结构 - -首版建议公开如下 API 树: - -```csharp -Brisk.InitializeAsync(BriskOptions options) -Brisk.Shutdown() - -Brisk.IsInitialized -Brisk.IsLoggedIn -Brisk.AccessToken -Brisk.PlayerId -Brisk.Identity -Brisk.Options -Brisk.Bootstrap - -Brisk.Auth.LoginWithUserIdAsync(string loginProvider, string loginUserId, BriskProfile profile = null) -Brisk.Auth.LoginWithCodeAsync(string loginProvider, string code, BriskProfile profile = null) -Brisk.Auth.LogoutAsync() - -Brisk.Player.GetMeAsync() - -Brisk.Config.GetCurrentAsync() -Brisk.Config.RefreshAsync() - -Brisk.Announcements.GetListAsync() -Brisk.Announcements.MarkReadAsync(long id) - -Brisk.Leaderboard.GetTopAsync(string rankKey, int limit = 20) -Brisk.Leaderboard.GetMeAsync(string rankKey) -Brisk.Leaderboard.GetAroundMeAsync(string rankKey, int range = 10) -Brisk.Leaderboard.SubmitScoreAsync(string rankKey, long score) -Brisk.Leaderboard.GetCurrentSeasonAsync(string rankKey) -Brisk.Leaderboard.GetSeasonHistoryAsync(string rankKey, int limit = 20) -Brisk.Leaderboard.GetSeasonHistoryDetailAsync(string rankKey, string seasonId, int limit = 20) - -Brisk.Archive.GetSlotsAsync() -Brisk.Archive.GetMetaAsync(int slotNo) -Brisk.Archive.UploadAsync(int slotNo, byte[] bytes, int? baseVersion = null, string checksum = null) -Brisk.Archive.DownloadAsync(int slotNo) - -Brisk.Space.GetByPlayerIdAsync(string playerId) -Brisk.Space.GetByLoginIdentityAsync(string loginProvider, string loginUserId) -Brisk.Space.GetStatsByPlayerIdAsync(string playerId) -Brisk.Space.GetStatsByLoginIdentityAsync(string loginProvider, string loginUserId) -Brisk.Space.LikeByPlayerIdAsync(string playerId) -Brisk.Space.UnlikeByPlayerIdAsync(string playerId) -Brisk.Space.LikeByLoginIdentityAsync(string loginProvider, string loginUserId) -Brisk.Space.UnlikeByLoginIdentityAsync(string loginProvider, string loginUserId) -Brisk.Space.UpdateMyAsync(object payload) -Brisk.Space.GetMyVisitsAsync() -``` - -说明: - -- `bootstrap` 不单独暴露成模块入口,直接并入 `Brisk.InitializeAsync` -- `Brisk` 根节点只负责全局状态、生命周期、事件和模块入口 -- 具体业务能力放在 `Brisk.Auth`、`Brisk.Leaderboard` 等模块下 - -## 3. BriskOptions 设计 - -`BriskOptions` 只保留当前服务端确实需要的参数,并区分必填与推荐字段。 - -### 3.1 必填字段 - -根据当前服务端文档,以下字段应为初始化必填: - -```csharp -public sealed class BriskOptions -{ - public string BaseUrl; - public string GameKey; - public string ClientVersion; -} -``` - -原因: - -- `BaseUrl` - - SDK 所有接口的基础地址 - - 推荐直接传 API Base,例如 `https://host/api` -- `GameKey` - - `bootstrap`、`config/current`、`auth/login/exchange` 都需要 -- `ClientVersion` - - 当前服务端接口中为可选,但强烈建议传入 - - 会影响最低版本校验与动态配置命中 - -### 3.2 推荐字段 - -这些字段不是所有场景必填,但推荐在初始化时一次传入,后续由 SDK 自动复用: - -```csharp -public sealed class BriskOptions -{ - public string BaseUrl; - public string GameKey; - public string ClientVersion; - public string DeviceId; - public bool EnableLog = false; - public bool ValidateSessionOnInitialize = true; - public IBriskTokenStore TokenStore; - public IBriskErrorPresenter ErrorPresenter; - public Action ExitHandler; -} -``` - -说明: - -- `ClientVersion` - - `bootstrap`、`config/current`、`login` 推荐传入 - - 后续可用于最低版本校验 -- `DeviceId` - - `bootstrap`、`config/current`、`login` 推荐传入 - - 便于服务端做环境识别与问题排查 -- `EnableLog` - - 是否输出 SDK 调试日志 -- `ValidateSessionOnInitialize` - - 初始化时如果本地有 token,是否自动调用 `player/me` 校验有效性 -- `TokenStore` - - 登录态持久化存储接口 -- `ErrorPresenter` - - 默认错误弹窗展示接口 -- `ExitHandler` - - 遇到需要默认退出的阻断错误时,由宿主游戏接管实际退出逻辑 - -### 3.3 首版初始化建议 - -为了保持易用,首版建议如下: - -- 调用方最少只需要传 `BaseUrl`、`GameKey` -- `ClientVersion` 强烈建议传 -- `DeviceId` 建议有就传 -- 如果不传 `TokenStore`,SDK 使用默认本地实现 -- 如果不传 `ErrorPresenter`,SDK 使用默认实现或仅触发事件 -- 如果不传 `ExitHandler`,SDK 不直接强制退出,而是交给项目层自行处理 - -## 4. 初始化生命周期 - -`Brisk.InitializeAsync` 的建议流程如下: - -### 4.1 标准流程 - -```txt -1. 校验 BriskOptions -2. 规范化 BaseUrl -3. 初始化 Core 运行时对象 -4. 调用 GET /client/bootstrap -5. 缓存 bootstrap 结果 -6. 根据 bootstrap 检查维护状态与最低版本 -7. 初始化各模块入口 -8. 从 TokenStore 恢复本地 token -9. 如果配置了 ValidateSessionOnInitialize 且存在 token,则调用 GET /player/me 验证会话 -10. 进入可用状态 -``` - -### 4.2 具体建议 - -- `BaseUrl` 允许调用方传: - - `https://host/api` - - 或 `https://host` -- SDK 内部统一规范化为最终 API Base -- 初始化阶段不依赖 `login_provider / login_user_id` -- `bootstrap` 结果建议缓存到: - - `Brisk.Bootstrap` -- 如果初始化阶段检测到以下情况,直接触发全局阻断错误: - - 项目维护中 - - 最低版本不满足 - - 本地恢复到的账号已失效或已封禁 - -### 4.3 不建议的行为 - -首版不建议做以下事情: - -- 不自动静默重新登录 - - 当前服务端没有 refresh token 机制 -- 不在初始化中自动执行第三方平台登录 - - 第三方登录由游戏侧完成,Brisk 只负责兑换 Brisk 会话 -- 不把所有模块的预加载都塞进初始化 - - 公告、排行榜、空间等业务数据由调用方按需拉取 - -## 5. 登录态设计 - -首版登录核心模型: - -```txt -login_provider + login_user_id -> POST /auth/login/exchange -> Brisk access_token -或 -login_provider + code -> POST /auth/login/exchange -> Brisk access_token -``` - -身份建议分为两层: - -- 外部身份 - - `login_provider` - - `login_user_id` -- 内部身份 - - `player_id` - - `project_account_id` - -推荐登录行为: - -```txt -1. 游戏先完成第三方平台登录 -2. 游戏拿到 `login_provider` -3. 再拿到 `login_user_id` 或 `code` -4. 调用 `Brisk.Auth.LoginWithUserIdAsync(...)` 或 `Brisk.Auth.LoginWithCodeAsync(...)` -5. SDK 保存 token、过期时间、player_id、project_account_id -6. 后续玩家态接口自动附带 Bearer Token -``` - -## 6. 错误处理总设计 - -首版错误处理原则改为: - -- SDK 只统一接管严重阻断错误 -- 普通接口错误不走全局监听 -- 普通接口错误由调用方在调用处自行处理 -- SDK 默认提供一套阻断错误弹窗 UI -- 开发者可以替换默认 UI 或自行接管严重错误 - -内部处理链路建议如下: - -```txt -BriskHttpClient --> BriskResponseParser --> BriskErrorClassifier --> 严重错误进入 SDK 全局处理 --> 普通错误直接返回给当前调用方 -``` - -职责划分: - -- `BriskHttpClient` - - 发请求、收响应、拿到 HTTP 状态码 -- `BriskResponseParser` - - 解析 `code/message/data` -- `BriskErrorClassifier` - - 把错误码映射成 SDK 语义错误 -- 严重错误全局处理 - - 只处理维护、封号、登录态失效等阻断错误 -- 普通错误调用点处理 - - 由调用方 `try/catch` - - 或由调用方传入当前接口自己的回调处理 - -## 7. 错误分级 - -首版建议将错误分为以下几类: - -```csharp -public enum BriskErrorKind -{ - Retryable, - Business, - AuthExpired, - GlobalBlocking, - Fatal -} -``` - -说明: - -- `Retryable` - - 超时、网络抖动、429、临时服务不可用 -- `Business` - - 普通业务失败,例如存档冲突、参数不合法 - - 不进入 SDK 全局错误处理 -- `AuthExpired` - - 登录态失效,需要清理会话 - - 属于 SDK 全局接管范围 -- `GlobalBlocking` - - 封号、维护中、强制更新等,需要阻断当前玩家继续操作 - - 属于 SDK 全局接管范围 -- `Fatal` - - SDK 未初始化、关键配置错误、内部不可恢复异常 - - 只用于真正不可恢复的框架级错误 - -## 8. 错误码映射建议 - -根据当前错误码文档,首版建议如下处理: - -### 8.1 AuthExpired - -- `10001` 缺少 token -- `10002` token 无效 -- `10023` 缺少会话 - -默认行为: - -- 清空本地 token -- 更新 `Brisk.IsLoggedIn = false` -- 触发 `Brisk.OnAuthExpired` -- 默认弹出登录态失效提示 UI -- 抛出 `BriskAuthExpiredException` - -### 8.2 GlobalBlocking - -- `10003` 项目维护中 -- `10004` 玩家已封禁 -- `10005` 访问校验失败 -- `10025` 项目维护中 -- `10026` 玩家已封禁 - -默认行为: - -- 触发 `Brisk.OnBlockingError` -- 使用 SDK 默认 UI 弹出阻断提示 -- 如果开发者自定义了 `ErrorPresenter`,则由开发者 UI 接管展示 -- 是否退出程序由 `ExitHandler` 决定,不在网络底层写死 - -进一步建议: - -- `10003`、`10025` -> `Maintenance` -- `10004`、`10026` -> `AccountBanned` -- `10005` -> `AccessDenied` - -### 8.3 Retryable - -- `80001` 请求过于频繁 -- `80002` 限流服务不可用 - -默认行为: - -- 短退避重试 -- 超过最大次数后抛出异常 -- 不触发全局 UI - -### 8.4 Business - -- `60016` 存档版本冲突 -- `60017` 校验值不匹配 -- `60018` 存档超出大小限制 -- `60021` 存档不存在 -- `70011` 玩家不存在 -- `70017` 玩家不存在 -- `70020` 玩家不存在 - -默认行为: - -- 不做系统级强拦截 -- 不走全局错误监听 -- 抛出对应业务异常,由调用方决定如何提示 -- 如果未来个别接口希望提供便利用法,可在该接口额外支持传入当前调用专属回调 - -## 9. 异常类命名建议 - -首版建议使用以下异常层次: - -```csharp -BriskException -BriskNetworkException -BriskHttpException -BriskApiException -BriskBusinessException -BriskAuthExpiredException -BriskBlockingException -BriskMaintenanceException -BriskAccountBannedException -BriskRateLimitException -BriskArchiveConflictException -BriskArchiveChecksumException -BriskArchiveTooLargeException -BriskNotInitializedException -``` - -说明: - -- `BriskException` - - SDK 所有异常的统一基类 -- `BriskApiException` - - 已成功收到接口响应,但 `code != 0` -- `BriskBusinessException` - - 普通业务错误 -- `BriskAuthExpiredException` - - 登录态失效 -- `BriskBlockingException` - - 全局阻断错误的公共基类 -- `BriskMaintenanceException` - - 维护中 -- `BriskAccountBannedException` - - 账号封禁 -- `BriskNotInitializedException` - - 未初始化即调用模块接口 - -## 10. 全局事件命名建议 - -首版建议 `Brisk` 根节点提供以下全局事件: - -```csharp -Brisk.OnInitialized -Brisk.OnLoggedIn -Brisk.OnLoggedOut -Brisk.OnAuthExpired -Brisk.OnBlockingError -``` - -建议语义: - -- `OnInitialized` - - SDK 初始化完成 -- `OnLoggedIn` - - 登录成功 -- `OnLoggedOut` - - 主动登出完成 -- `OnAuthExpired` - - 登录态失效 -- `OnBlockingError` - - 维护、封号、访问阻断等全局错误 - -可选接管接口: - -```csharp -Brisk.SetErrorPresenter(IBriskErrorPresenter presenter) -Brisk.SetExitHandler(Action exitHandler) -``` - -## 11. 关于“底层直接弹窗并退出程序”的建议 - -这个方向本身是合理的,但不建议把“弹窗”和“退出程序”都硬编码在网络底层。 - -更推荐的做法是: - -```txt -网络底层识别错误 --> 严重错误交给 SDK 核心处理 --> 默认错误展示器弹窗 --> 是否退出由宿主游戏或 ExitHandler 决定 -``` - -这样做的好处: - -- 设计更常规 -- 便于项目方接管 UI 风格 -- 便于区分“该回登录页”还是“该退出程序” -- 避免网络层和游戏表现层耦合过深 -- 避免普通接口错误被 SDK 过度吞掉或误处理 - -具体建议: - -- `登录态失效` - - 默认不退出程序 - - 默认弹窗提示后清会话并回登录流程 -- `账号封禁` - - 默认弹窗提示后由项目方决定回登录页或退出 -- `维护中` - - 默认阻断流程并提示 -- `Fatal` - - 可以作为最接近“提示后退出”的类型 - -## 12. 可选扩展:标准模式与弱网模式 - -这项需求合理,但优先级建议放在首版正常逻辑之后。 - -后续可以考虑增加: - -```csharp -public enum BriskNetworkMode -{ - Standard, - WeakNetwork -} -``` - -两者差异可以主要体现在: - -- 重试次数 -- 超时时间 -- 429 退避策略 -- 是否对部分只读接口自动重试 - -建议首版先只做: - -- 一个默认标准策略 -- 策略入口预留在 `BriskOptions` - -例如: - -```csharp -public sealed class BriskOptions -{ - public BriskNetworkMode NetworkMode = BriskNetworkMode.Standard; -} -``` - -但首版实现只落 `Standard` 即可。 - -## 13. 首版内部结构建议 - -```txt -Assets/ - BriskSdk/ - Runtime/ - Core/ - Brisk.cs - BriskOptions.cs - BriskContext.cs - BriskSession.cs - BriskHttpClient.cs - BriskModuleExecutor.cs - BriskErrorClassifier.cs - Auth/ - Player/ - Config/ - Announcement/ - Leaderboard/ - Archive/ - Space/ - Models/ - Storage/ - Exceptions/ - Samples/ - QuickStart/ - Scenes/ - BriskQuickStartScene.unity - -PackageSource/ - com.foldcc.cc-framework.BriskGameServer/ - package.json - README.md - CHANGELOG.md - Documentation~/ -``` - -对外尽量只暴露: - -- `Brisk` -- `BriskOptions` -- 各模块入口类 -- 结果数据结构 -- 必要异常类 - -## 14. 当前阶段结论 - -当前已明确的设计结论: - -- 对外统一使用 `Brisk.xxx` -- 初始化完成后各模块直接可用 -- 初始化参数不再包含 `channel / platform` -- 登录模型统一为 `login_provider / login_user_id / code` -- `BriskOptions` 最少只要求 `BaseUrl`、`GameKey` -- `ClientVersion` 为可选但强烈建议传入 -- 网络底层负责识别错误,不直接写死 UI 和退出行为 -- SDK 核心负责全局错误策略、全局事件和默认表现 -- “弱网模式”作为后续扩展项预留,不阻塞首版实现 - -## 15. 下一步建议 - -建议按以下顺序继续推进: - -1. 先搭 SDK 骨架与目录结构 -2. 先实现 `Brisk.InitializeAsync` -3. 先打通 `Auth`、`Player`、`Leaderboard` -4. 再接入 `Archive` 的二进制上传下载 -5. 最后补充全局错误展示器与默认本地存储实现 diff --git a/README.md b/README.md new file mode 100644 index 0000000..de8f10a --- /dev/null +++ b/README.md @@ -0,0 +1,127 @@ +# BriskGameServer + +Brisk Unity SDK 原始开发工程。 + +这个仓库本身是 Unity 工程,用于日常开发、测试、联调和后续迭代;对外发布的 UPM package 不直接使用整个仓库,而是从子目录产出。 + +## 当前状态 + +当前 SDK 已完成主流程能力: + +- SDK 初始化与 bootstrap +- 本地会话恢复 +- 按 `login_user_id` 登录 +- 按 `code` 登录 +- 玩家信息 +- 动态配置 +- 公告 +- 排行榜 +- 云存档 +- 玩家空间 +- 严重错误默认 IMGUI 提示 + +静态入口保持为: + +- `Brisk.xxx` +- `Brisk.Auth.xxx` +- `Brisk.Leaderboard.xxx` + +## 工程结构 + +开发态源码与样例位于: + +- `Assets/BriskSdk/Runtime` +- `Assets/BriskSdk/Samples/QuickStart` +- `Assets/Scenes/BriskQuickStartScene.unity` + +其中: + +- `Runtime` 是 SDK 活代码 +- `Samples/QuickStart` 是示例脚本与样例程序集 +- `BriskQuickStartScene.unity` 是中文 IMGUI 测试场景 + +服务端参考文档位于: + +- `服务参考_临时` + +## 测试场景 + +直接打开: + +- `Assets/Scenes/BriskQuickStartScene.unity` + +运行后会看到一个中文 IMGUI 调试面板,可直接测试: + +- 初始化与重新初始化 +- 按用户 ID 登录 +- 按 code 登录 +- 玩家信息与配置 +- 公告读取与已读 +- 排行榜读取、提交分数、赛季查询 +- 云存档上传下载 +- 玩家空间读取、点赞、更新、访客 +- 全局事件日志与最近一次结果输出 + +## 发布结构 + +对外 package 发布目录位于: + +- `PackageSource/com.foldcc.cc-framework.BriskGameServer` + +该目录承载: + +- `package.json` +- `README.md` +- `CHANGELOG.md` +- `Documentation~` +- `Runtime` +- `Samples~` + +外部项目应通过这个子目录接入,而不是直接依赖整个 Unity 工程。 + +## 同步 package + +从开发态源码同步到发布目录时,执行: + +```powershell +./Tools/Sync-BriskPackage.ps1 +``` + +脚本会自动把以下内容同步到 package 子目录: + +1. `Assets/BriskSdk/Runtime` -> `PackageSource/com.foldcc.cc-framework.BriskGameServer/Runtime` +2. `Assets/BriskSdk/Samples/QuickStart` -> `PackageSource/com.foldcc.cc-framework.BriskGameServer/Samples~/QuickStart` +3. `Assets/Scenes/BriskQuickStartScene.unity` -> package sample 目录 + +## 发布规范 + +建议分支与 tag 约定如下: + +- 开发分支:`feature/...`、`fix/...` +- 发包分支:`release/upm-vX.Y.Z` +- 发包 tag:`upm/vX.Y.Z` + +推荐发布步骤: + +1. 在开发分支完成功能与测试 +2. 运行 `./Tools/Sync-BriskPackage.ps1` +3. 检查 `PackageSource/com.foldcc.cc-framework.BriskGameServer` +4. 更新 `package.json` 版本号与 `CHANGELOG.md` +5. 创建发布分支 `release/upm-vX.Y.Z` +6. 打 tag `upm/vX.Y.Z` +7. 推送发布分支与 tag + +外部项目 Git Package 接入示例: + +```text +http://private.lightyears.ltd:18650/foldcc/CC-Framework.BriskGameServer.git?path=/PackageSource/com.foldcc.cc-framework.BriskGameServer#upm/v0.1.0 +``` + +## 文档位置 + +仓库根目录只保留这一份总 README。 + +对外接入文档请看: + +- `PackageSource/com.foldcc.cc-framework.BriskGameServer/README.md` +- `PackageSource/com.foldcc.cc-framework.BriskGameServer/Documentation~/QuickStart.md`