From 6908ff73ebee83ea4fee7ad3e8da6ea7616ffea2 Mon Sep 17 00:00:00 2001 From: zzzisfunnyboy <7838555+zzzisfunnyboy@user.noreply.gitee.com> Date: Wed, 11 Jun 2025 23:41:21 +0800 Subject: [PATCH] 1 --- .obsidian/workspace.json | 175 +++++--- TODO.canvas | 10 - 外包 TODO.md | 13 - .../输入框架/游戏输入框架的设计(基于Unity).md | 182 ++++++++ 用户卡及游戏信息处理过程设计文档.md | 405 ------------------ 5 files changed, 294 insertions(+), 491 deletions(-) delete mode 100644 TODO.canvas delete mode 100644 外包 TODO.md create mode 100644 战斗/输入框架/游戏输入框架的设计(基于Unity).md delete mode 100644 用户卡及游戏信息处理过程设计文档.md diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 33c02a6..5a8d5db 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,21 +4,17 @@ "type": "split", "children": [ { - "id": "9490f88925707195", + "id": "f8022c29023d2af6", "type": "tabs", "children": [ { - "id": "4e6788fa2bacf67e", + "id": "efa82152d99167ff", "type": "leaf", "state": { - "type": "markdown", - "state": { - "file": "AllInHole/编辑器.md", - "mode": "source", - "source": false - }, + "type": "empty", + "state": {}, "icon": "lucide-file", - "title": "编辑器" + "title": "新标签页" } } ] @@ -34,13 +30,26 @@ "id": "b892947aee3a10a9", "type": "tabs", "children": [ + { + "id": "f2ac97a7addb8678", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical", + "autoReveal": false + }, + "icon": "lucide-folder-closed", + "title": "文件列表" + } + }, { "id": "bd33cd6e5600118d", "type": "leaf", "state": { "type": "search", "state": { - "query": "", + "query": "tag:#flashcards/政治/近代史", "matchingCase": false, "explainSearch": false, "collapseAll": false, @@ -72,7 +81,7 @@ } }, { - "id": "bd553af56bfd19e2", + "id": "4c191f6555b427bd", "type": "leaf", "state": { "type": "file-explorer", @@ -85,11 +94,11 @@ } } ], - "currentTab": 3 + "currentTab": 4 } ], "direction": "horizontal", - "width": 357.5 + "width": 338.5 }, "right": { "id": "d809b577c235ae94", @@ -124,8 +133,8 @@ "state": { "type": "calendar", "state": {}, - "icon": "lucide-file", - "title": "Plugin no longer active" + "icon": "calendar-with-checkmark", + "title": "Calendar" } }, { @@ -187,68 +196,108 @@ } ], "direction": "horizontal", - "width": 476.5, - "collapsed": true + "width": 476.5 }, "left-ribbon": { "hiddenItems": { - "switcher:打开快速切换": false, - "graph:查看关系图谱": false, - "canvas:新建白板": false, "daily-notes:打开/创建今天的日记": false, "templates:插入模板": false, + "canvas:新建白板": false, + "switcher:打开快速切换": false, + "graph:查看关系图谱": false, "command-palette:打开命令面板": false, "copilot:Open Copilot Chat": false } }, - "active": "4e6788fa2bacf67e", + "floating": { + "id": "8ad6c7a89369c9f6", + "type": "floating", + "children": [ + { + "id": "ea5faaa0d41b6909", + "type": "window", + "children": [ + { + "id": "5ac5102bf53c6860", + "type": "tabs", + "children": [ + { + "id": "fd65654aeee0713f", + "type": "leaf", + "state": { + "type": "empty", + "state": {}, + "icon": "lucide-file", + "title": "新标签页" + } + } + ] + } + ], + "direction": "vertical", + "x": 2595, + "y": 19, + "width": 1024, + "height": 800, + "maximize": false, + "zoom": 0 + } + ] + }, + "active": "4c191f6555b427bd", "lastOpenFiles": [ - "AllInHole/Temp.md", - "AllInHole/编辑器.md", - "未命名.md", + "面经/腾讯 网易 完美 字节 游戏客户端 游戏引擎(2020暑期实习岗) 综合笔 面经.md", + "面经", + "资源/打包/导航.md", + "资源/打包", + "资源/资源导入.md", + "资源", "网络同步.md", - "TODO.canvas", - "Timeline TODO.canvas", - "用户卡及游戏信息处理过程设计文档.md", - "AllInHole", - "外包项目/未命名.canvas", - "外包项目/编辑器业务功能.md", - "外包项目/编辑器UI.md", - "外包项目/编辑操作功能.md", - "外包项目/s.md", - "外包项目/TODO.md", - "外包项目/未命名看板.md", - "外包项目", - "战斗/写代码的诗人/战斗系统:状态配置管理(技能配置管理).md", - "战斗/战斗系统 - 3C相关.md", - "战斗/游戏知识学习——【战斗系统】.md", - "战斗/独立游戏-万字解析游戏战斗系统开发.md", - "战斗/动作.md", - "战斗/写代码的诗人/战斗系统:技能实现架构.md", - "战斗/写代码的诗人/战斗系统:属性管理.md", - "战斗/写代码的诗人/战斗系统:什么是数据驱动?.md", - "战斗/写代码的诗人/战斗系统:框架设计—战斗视角的GameObject.md", - "战斗/写代码的诗人/角色框架:GameObject类型实现.md", - "AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第一个用法|查漏补缺/思路.md", - "AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第一个用法|查漏补缺/如何搞钱/小白金融知识/01_初识通货膨胀:钱怎么就不值钱了.md", - "AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第二个用法|私人智囊团/我的侧写档案.md", - "战斗/写代码的诗人", - "TODO.md", - "性能优化/关于Unity加载优化,你可能遇到这些问题 - 知乎.md", - "AI for Obsidian/第二个用法|私人智囊团/我的长文参考", - "AI for Obsidian/第二个用法|私人智囊团", - "AI for Obsidian/插件相关说明", - "AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点9.md.edtz", - "AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点8.md.edtz", - "AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点7.md.edtz", - "AI for Obsidian/20250315 - 测试 Obsidian+ AI 的能力边界/第四个用法|成为对弈的棋手/正方观点/观点6.md.edtz", - "渲染/GPU/Pasted image 20230413163234.png", - "Mesh/图片/Pasted image 20221021171104.png", + "编辑器/时间轴编辑器/Timeline TODO.canvas", + "编辑器/图片/Pasted image 20221025121100.png", + "编辑器/时间轴编辑器", + "编辑器/图片", + "编辑器/SerializedObject.md", + "编辑器/SearchFilter UnityEditor筛选器.md", + "编辑器", + "算法/TopK 问题.md", + "算法", + "渲染/软渲染/图片/毛泽东选集(第一卷)_共产党员网.html", + "渲染/软渲染/图片/毛泽东选集(第一卷)_共产党员网 1.html", "渲染/软渲染/图片/Pasted image 20230613102109.png", + "渲染/软渲染/图片/FAQ.md", + "渲染/软渲染/透视矫正.md", + "渲染/软渲染/还未实现.md", + "渲染/软渲染/课程.md", + "渲染/软渲染/视锥剔除.md", + "渲染/软渲染/视口剔除.md", + "渲染/软渲染/图片", + "渲染/软渲染/冯 高光.md", + "渲染/GPU/Pasted image 20230413163234.png", + "渲染/一些渲染效果/Unity可交互雪地渲染Part5-雪地闪光及SSS.md", + "渲染/一些渲染效果/Unity 技术美术Trick —— dither妙用.md", + "渲染/GPU/GPU渲染流程.md", + "操作系统/多级缓存队列.md", + "战斗/写代码的诗人/战斗系统:框架设计—战斗视角的GameObject.md", + "战斗/输入框架/游戏输入框架的设计(基于Unity).md", + "战斗/写代码的诗人/战斗系统:状态配置管理(技能配置管理).md", + "战斗/写代码的诗人/战斗系统:技能实现架构.md", + "战斗/写代码的诗人/战斗系统:什么是数据驱动?.md", + "战斗/写代码的诗人/战斗系统:属性管理.md", + "战斗/独立游戏-万字解析游戏战斗系统开发.md", + "战斗/游戏知识学习——【战斗系统】.md", + "Mesh/图片/Pasted image 20221021171104.png", + "渲染/软渲染/图片/Pasted image 20250609171235.png", + "InBox/TODO.canvas", + "InBox/编辑器/时间轴编辑器/Timeline TODO.canvas", + "InBox/战斗/动作时间轴 随想.canvas", + "InBox/编辑器/图片/Pasted image 20221025121100.png", + "InBox/渲染/GPU/Pasted image 20230413163234.png", + "InBox/Mesh/图片/Pasted image 20221021171104.png", + "InBox/渲染/软渲染/图片/Pasted image 20230613102109.png", "未命名 1.canvas", "并行计算/GPU.canvas", "并行计算/CPU.canvas", - "未命名 2.canvas", - "编辑器/图片/Pasted image 20221025121100.png" + "未命名 2.canvas" ] } \ No newline at end of file diff --git a/TODO.canvas b/TODO.canvas deleted file mode 100644 index edd0fab..0000000 --- a/TODO.canvas +++ /dev/null @@ -1,10 +0,0 @@ -{ - "nodes":[ - {"id":"c2a9a261abbf026a","type":"text","text":"# rogulite\n\n分好武器、招式\n->构建->抽卡\n动画表现\n表演->大招、出场\n->timeline\n","x":-400,"y":-637,"width":250,"height":234,"color":"2"}, - {"id":"fd504a901787835c","type":"text","text":"# 宠物\n\n","x":-1080,"y":-586,"width":250,"height":367,"color":"4"}, - {"id":"09d19f9a3b86463f","x":-760,"y":-880,"width":250,"height":326,"type":"text","text":"# 优化项\n\n\n地图地板图片导入 自动修改图片大小\n\n将RoomConfig改到RoomBase里\n"} - ], - "edges":[ - {"id":"abda214f71bdc137","fromNode":"09d19f9a3b86463f","fromSide":"bottom","toNode":"fd504a901787835c","toSide":"right"} - ] -} \ No newline at end of file diff --git a/外包 TODO.md b/外包 TODO.md deleted file mode 100644 index c14b7e5..0000000 --- a/外包 TODO.md +++ /dev/null @@ -1,13 +0,0 @@ -[^1] - -[^1]: 地形系统 - - FallItem - - ItemDefine - - -[^2] - -[^2]: 材质球 - standand加上mask模板,idmap就是mask图 diff --git a/战斗/输入框架/游戏输入框架的设计(基于Unity).md b/战斗/输入框架/游戏输入框架的设计(基于Unity).md new file mode 100644 index 0000000..e846608 --- /dev/null +++ b/战斗/输入框架/游戏输入框架的设计(基于Unity).md @@ -0,0 +1,182 @@ +https://zhuanlan.zhihu.com/p/424070778 + +### 游戏输入系统设计总结 + +#### **核心设计思路** + +1. **输入抽象分层**: + + - **基础输入层**:将输入抽象为按钮(`IButtonInput`)和轴值(`IAxisInput`)两类 + + - **复合输入层**:支持多个按键绑定到同一行为(`CompoundButtonInput`/`CompoundAxisInput`) + + - **行为映射层**:将输入状态转化为游戏行为(`InputButtonProcessor`) + +2. **关键接口设计**: + + csharp + + 复制 + + 下载 + + // 按钮输入 + public interface IButtonInput { + bool GetButton(); // 获取按钮状态 + } + + // 轴值输入 + public interface IAxisInput { + float AxisValue(); // 获取轴值(-1~1) + } + + +#### **核心组件实现** + +1. **基础输入实现**: + + - `KeyCodeButtonInput`:封装Unity键值检测 + + - `ButtonAxisInput`:将按钮转为轴值(正/负方向) + +2. **复合输入容器**: + + csharp + + 复制 + + 下载 + + // 复合按钮(OR逻辑) + public class CompoundButtonInput : IButtonInput { + public bool GetButton() { + foreach(var btn in Buttons) + if(btn.GetButton()) return true; + return false; + } + } + + // 复合轴值(取极值叠加) + public class CompoundAxisInput : IAxisInput { + public float AxisValue() { + float max=0, min=0; + foreach(var axis in Axis) { + float val = axis.AxisValue(); + if(val<0) min = Mathf.Min(min, val); + else max = Mathf.Max(max, val); + } + return max + min; + } + } + +3. **行为状态机**: + + csharp + + 复制 + + 下载 + + public class InputButtonProcessor { + // 状态记录 + public bool WasPressed; // 上一帧状态 + public bool IsPressed; // 当前帧状态 + + // 状态查询属性 + public bool OnPressed => IsPressed && !WasPressed; // 刚按下 + public bool OnReleased => !IsPressed && WasPressed; // 刚释放 + + // 状态更新 + public void Update(bool isPressed) { + WasPressed = IsPressed; + IsPressed = isPressed; + } + } + + +#### **系统工作流程** + +1. **初始化绑定**(PlayerInput): + + csharp + + 复制 + + 下载 + + public void AddKeyboardControls() { + // 水平轴:A/D/左右箭头 + HorizontalDigiPad.Add(new ButtonAxisInput( + new KeyCodeButtonInput(KeyCode.A), + ButtonAxisInput.Mode.Negative + )); + + // 跳跃:空格/Z/Y + Jump.Add(new KeyCodeButtonInput(KeyCode.Space)); + } + +2. **状态更新**(每帧): + + csharp + + 复制 + + 下载 + + void RefreshControls() { + // 1. 更新轴值输入 + Input.HorizontalValue = HorizontalDigiPad.AxisValue(); + + // 2. 更新按钮状态机 + for(int i=0; i 该设计通过分层抽象解决了多键位绑定问题,核心价值在于将**物理输入**到**游戏行为**的映射关系标准化,为复杂输入需求提供了可扩展框架。 \ No newline at end of file diff --git a/用户卡及游戏信息处理过程设计文档.md b/用户卡及游戏信息处理过程设计文档.md deleted file mode 100644 index 5216c20..0000000 --- a/用户卡及游戏信息处理过程设计文档.md +++ /dev/null @@ -1,405 +0,0 @@ -# 用户卡信息处理系统设计文档 - -## 1. 系统概述 - -该系统主要由控制器插件、业务插件和游戏端三部分组成,通过TCP通信实现用户卡信息处理和游戏数据收集。 - -## 2. 系统架构 - -### 字符流程图 -``` -+----------------+ +----------------+ +----------------+ -| 控制器插件 | | 业务插件 | | 游戏端 | -| | | | | | -| - 扫描用户卡 | | - 处理用户信息 | | - 接收用户信息 | -| - 读取卡信息 |--->| - 存储本地数据 |<-->| - 发送游戏信息 | -| - 通知业务插件 | | - 网络请求处理 | | - 本地备份处理 | -+----------------+ +----------------+ +----------------+ - | ^ - v | - +-----------------+ - | 服务器 | - | - 用户资料数据库 | - | - 游戏数据处理 | - +-----------------+ -``` - -### mermaid流程图 -```mermaid -flowchart LR - A[控制器插件\n- 扫描用户卡\n- 读取卡信息\n- 通知业务插件] --> B[业务插件\n- 处理用户信息\n- 存储本地数据\n- 网络请求处理] - B <--> C[游戏端\n- 接收用户信息\n- 发送游戏信息\n- 本地备份处理] - B <--> D[服务器\n- 用户资料数据库\n- 游戏数据处理] -``` - -## 3. 系统详细流程 - -### 3.1 用户卡信息处理流程 - -#### 流程说明 -用户卡信息处理流程描述了从控制器插件扫描用户卡到业务插件向游戏端发送用户信息的完整过程。当控制器插件检测到用户卡扫描信息后,会通知业务插件。业务插件根据网络状态决定从服务器请求用户资料或从本地数据库读取用户信息。如果网络可用,业务插件会请求最新的用户信息并存储到本地;如果网络不可用或请求失败,则从本地SQLite数据库读取历史记录;若本地无记录,则构造默认用户信息。最终,业务插件将完整的用户信息通过TCP(12101端口)发送给游戏端。 - -#### 字符流程图 -``` -+----------------+ +----------------+ +----------------+ +----------------+ -| 控制器插件 | | 业务插件 | | 网络/本地数据库 | | 游戏端 | -+-------+--------+ +-------+--------+ +-------+--------+ +-------+--------+ - | | | | - | 扫描到用户卡 | | | - +--------------------->+ | | - | | | | - | | 检查网络状态 | | - | +--------------------->+ | - | | | | - | | 有网络: 请求用户信息 | | - | +--------------------->+ | - | | | | - | | 返回用户信息 | | - | +<---------------------+ | - | | | | - | | 无网络/请求失败: | | - | | 读取本地数据 | | - | +--------------------->+ | - | | | | - | | 返回本地数据 | | - | +<---------------------+ | - | | | | - | | 构造用户信息 | | - | +-------------------------------------------------+ - | | | | | - | | TCP(12101)发送用户信息| | | - | +--------------------->+--------------------->+ | - | | | | | - | | | | | - | | 本地存储用户信息 <---+ - | | | | -+-------+--------+ +-------+--------+ +-------+--------+ +-------+--------+ -``` - -#### mermaid流程图 -```mermaid -sequenceDiagram - participant 控制器插件 - participant 业务插件 - participant 网络/本地数据库 - participant 游戏端 - - 控制器插件->>业务插件: 扫描到用户卡 - 业务插件->>网络/本地数据库: 检查网络状态 - - alt 有网络 - 业务插件->>网络/本地数据库: 请求用户信息 - 网络/本地数据库-->>业务插件: 返回用户信息 - else 无网络/请求失败 - 业务插件->>网络/本地数据库: 读取本地数据 - 网络/本地数据库-->>业务插件: 返回本地数据 - end - - 业务插件->>业务插件: 构造用户信息 - 业务插件->>游戏端: TCP(12101)发送用户信息 - 游戏端->>游戏端: 本地存储用户信息 -``` - -### 3.2 游戏信息收集流程 - -#### 流程说明 -游戏信息收集流程描述了业务插件如何通过TCP监听接收游戏端发送的消息并进行处理的过程。业务插件监听TCP(12103端口)以接收来自游戏端的信息。根据接收到的消息类型(由标识头区分),业务插件会进行不同的处理:如果是游戏结束消息(标识头为"game-over"),业务插件会更新对应Player的状态,之后接收到该Player的游戏信息将不再与用户卡关联;如果是游戏业务信息,业务插件会尝试通过网络将数据发送到服务器,若网络不可用或发送失败,则将数据存储到本地SQLite数据库中以便稍后同步。 - -#### 字符流程图 -``` -+----------------+ +----------------+ +----------------+ -| 游戏端 | | 业务插件 | | 服务器/本地存储 | -+-------+--------+ +-------+--------+ +-------+--------+ - | | | - | TCP(12103)发送游戏信息| | - +--------------------->+ | - | | | - | | 检查消息类型 | - | +-----------------+ | - | | | | - | | 游戏结束消息 | | - | |-----------------+ | - | | 更新Player状态 | | - | +-----------------+ | - | | | | - | | 游戏业务信息 | | - | |-----------------+ | - | | 检查网络状态 | | - | +--------------------->+ - | | | - | | 有网络: 发送到服务器 | - | +--------------------->+ - | | | - | | 响应结果 | - | +<---------------------+ - | | | - | | 无网络/发送失败: | - | | 存储到本地SQLite | - | +--------------------->+ - | | | -+-------+--------+ +-------+--------+ +-------+--------+ -``` - -#### mermaid流程图 -```mermaid -sequenceDiagram - participant 游戏端 - participant 业务插件 - participant 服务器/本地存储 - - 游戏端->>业务插件: TCP(12103)发送游戏信息 - - alt 游戏结束消息 - 业务插件->>业务插件: 更新Player状态 - else 游戏业务信息 - 业务插件->>业务插件: 检查网络状态 - alt 有网络 - 业务插件->>服务器/本地存储: 发送到服务器 - 服务器/本地存储-->>业务插件: 响应结果 - else 无网络/发送失败 - 业务插件->>服务器/本地存储: 存储到本地SQLite - end - end -``` - -### 3.3 游戏信息发送失败处理流程 - -#### 流程说明 -游戏信息发送失败处理流程描述了当游戏端无法直接将游戏信息发送给业务插件时的备份处理机制。当游戏端向业务插件发送信息超时或无响应时,游戏端会将这些数据存储到特定目录中的文件系统,采用一条数据一个文件的方式。业务插件会定期检查该目录,读取这些文件中的数据,处理(如重新发送到服务器或记录到本地数据库)后再删除这些文件。这种机制确保了即使在业务插件暂时不可用的情况下,游戏数据也不会丢失,提高了系统的可靠性和容错性。 - -#### 字符流程图 -``` -+----------------+ +----------------+ +----------------+ -| 游戏端 | | 文件系统 | | 业务插件 | -+-------+--------+ +-------+--------+ +-------+--------+ - | | | - | 信息发送超时/无响应 | | - +-----------------+ | | - | | | | - | 创建数据文件 | | | - |----------------+ | | - | 将数据写入文件 | | | - +--------------------->+ | - | | | - | | 业务插件定期检查目录 | - | +<---------------------+ - | | | - | | 读取数据文件 | - | +--------------------->+ - | | | - | | 处理数据(重发/记录) | - | +<---------------------+ - | | | - | | 处理完成后删除文件 | - | +<---------------------+ - | | | -+-------+--------+ +-------+--------+ +-------+--------+ -``` - -#### mermaid流程图 -```mermaid -sequenceDiagram - participant 游戏端 - participant 文件系统 - participant 业务插件 - - 游戏端->>游戏端: 信息发送超时/无响应 - 游戏端->>游戏端: 创建数据文件 - 游戏端->>文件系统: 将数据写入文件 - 业务插件->>文件系统: 定期检查目录 - 文件系统->>业务插件: 读取数据文件 - 业务插件->>业务插件: 处理数据(重发/记录) - 业务插件->>文件系统: 处理完成后删除文件 -``` - -## 4. 信息结构 - -### 4.1 发送给游戏的用户信息JSON结构 - -```json -{ - "result": true, // 操作结果 - "errMsg": "", // 错误信息 - "statusCode": 0, // 状态码(0=成功,1=未绑定,2=无网) - "tag": "user-info", // 标识标签,区分不同类型的信息 - "data": { - "playerIndex": 1, // player索引 - "cardId": "123456", // 卡ID - "cardSn": "789012", // 卡序列号 - "userName": "张三", // 用户名称 - "userAvatar": "http://example.com/avatar.jpg" // 用户头像 - } -} -``` - -#### 4.1.1 请求服务器查询玩家资料 - 请求写入排行榜 -```json -{ - "tag": "update-user-info", // 标识标签,区分不同类型的信息 - "data": { - "cardId": "123456", // 卡ID - "score": 10000 //积分 - } -} -``` - 回复 -```json -{ - "result": true, // 操作结果 - "errMsg": "", // 错误信息 - "statusCode": 0, // 状态码(0=成功,1=未绑定,2=无网) - "tag": "", // 标识标签,区分不同类型的信息 - "data":{} -} -``` - - 请求查询玩家信息 -```json -{ - "tag": "select-user-info", // 标识标签,区分不同类型的信息 - "data": { - "cardId": "123456", // 卡ID - } -} -``` - 回复 -```json -{ - "result": true, // 操作结果 - "errMsg": "", // 错误信息 - "statusCode": 0, // 状态码(0=成功,1=未绑定,2=无网) - "tag": "user-info", // 标识标签,区分不同类型的信息 - "data": { - "playerIndex": 1, // player索引 - "cardId": "123456", // 卡ID - "cardSn": "789012", // 卡序列号 - "userName": "张三", // 用户名称 - "userAvatar": "http://example.com/avatar.jpg" // 用户头像 - ... - } -} -``` - -### 4.2 游戏结束消息JSON结构 - -```json -{ - "result": true, // 操作结果 - "errMsg": "", // 错误信息 - "statusCode": 0, // 状态码(0=成功,非0=失败) - "tag": "game-over", // 标识标签 - "data": { - "playerIndex": 1, // player索引 - "cardId": "123456", // 卡ID - "timestamp": 1634567890 // 时间戳 - } -} -``` - -### 4.3 游戏业务信息JSON结构 - -```json -{ - "result": true, // 操作结果 - "errMsg": "", // 错误信息 - "statusCode": 0, // 状态码(0=成功,非0=失败) - "tag": "game-data", // 标识标签 - "data": { - "playerIndex": 1, // player索引 - "cardId": "123456", // 卡ID - "gameData": { // 游戏数据(根据具体业务定义) - // 具体业务数据 - }, - "timestamp": 1634567890 // 时间戳 - } -} -``` - -## 5. 通信端口说明 - -- **12101端口**:游戏端监听,业务端发送消息 -- **12103端口**:业务端监听,游戏端发送消息 - -## 6. 数据持久化 - -### 6.1 SQLite数据结构 - -#### 用户信息表 -```sql -CREATE TABLE user_info ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - card_id TEXT NOT NULL, - card_sn TEXT NOT NULL, - user_name TEXT, - user_avatar TEXT, - last_updated INTEGER, - UNIQUE(card_id, card_sn) -); -``` - -#### 游戏数据表 -```sql -CREATE TABLE game_data ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - card_id TEXT NOT NULL, - player_index INTEGER NOT NULL, - data_type TEXT NOT NULL, - data_content TEXT NOT NULL, - timestamp INTEGER NOT NULL, - is_synced INTEGER DEFAULT 0 -); -``` - -### 6.2 文件存储结构 - -游戏数据文件命名格式:`game_data_{timestamp}_{playerIndex}_{cardId}.json` - -## 7. 注意事项 - -### 7.1 数据安全与隐私 - -- 用户卡信息应进行加密存储 -- 本地数据应设置访问权限限制 -- 网络传输过程采用HTTPS或加密通道 - -### 7.2 数据同步机制 - -- 本地数据与服务器数据定期同步机制 -- 冲突解决策略(以服务器数据为准或采用时间戳) -- 同步频率设置(定时/事件触发) - -### 7.3 错误处理与恢复 - -- 网络恢复后的数据自动上传机制 -- 重试策略(指数退避算法) -- 错误日志记录与报警机制 -- 异常情况下的回滚机制 - -### 7.4 性能优化 - -- SQLite查询优化 -- 批量数据处理 -- 队列机制避免并发问题 -- 异步处理大量数据 - -### 7.5 本地存储管理 - -- 定期清理过期数据 -- 存储空间监控 -- 数据备份机制 -- 存储空间不足时的处理策略 - -### 7.6 监控与日志 - -- 关键操作日志记录 -- 系统状态监控 -- 异常情况报警机制 - -## 8. 系统扩展性考虑 - -- 支持多种类型用户卡的可扩展接口 -- 业务消息类型的可扩展设计 -- 版本兼容性处理机制 -- 插件化架构设计 -- 配置化管理 \ No newline at end of file