本篇 核心知识点 :部署 MySQL、数据库环境安装排错、数据库 / 数据表创建、MySQL C# 驱动引用、DBHelper 单例数据库工具封装、数据表设计(玩家 User 表)、数据库增删改查全套封装、UserInfo 玩家实体类、服务端对接数据库、注册 / 登录业务数据库校验、常见运行报错排查、游戏业务落地完整流程
一、MySQL 环境部署:PHPStudy 小皮面板
1 部署工具介绍
PHPStudy(小皮)集成 MySQL、Apache、Nginx,一键安装数据库,无需复杂环境变量配置,适合学习开发;推荐版本MySQL 5.7.26,兼容性强,极少语法兼容报错。
2 完整安装步骤
-
下载小皮面板安装包,右键以管理员身份运行安装(避免权限不足安装失败);
-
打开软件「软件管理」→数据库分类,找到 MySQL5.7.26 点击一键安装;
-
安装完成后首页点击「启动」数据库服务;
-
数据库默认通信端口:3306,固定端口不要修改,C# 代码统一写 3306 连接。
3 安装 & 启动常见故障排错
-
安装失败:关闭杀毒、防火墙,管理员运行安装程序;
-
启动数据库自动闪退 / 停止:本机其他程序占用 3306 端口、之前残留 MySQL 服务冲突,卸载旧数据库再重装;
-
无法打开数据库管理工具:数据库服务未正常启动,先确认启动按钮为绿色运行状态。
4 创建游戏专属数据库
-
打开小皮内置数据库可视化工具;
-
新建数据库,命名
game2602(项目编号命名规范); -
数据库账号、密码统一设为
game2602,方便代码配置,正式项目需设置复杂密码; -
保存后刷新列表,确认数据库创建成功。
二、C# 数据库驱动配置(MySql.Data.dll)
1 驱动作用
C# 程序无法直接操作 MySQL,必须引入官方驱动 dll,封装底层 TCP 通信、SQL 语句执行逻辑。
2 配置流程
-
下载
MySql.Data.dll驱动文件,固定文件夹存放; -
创建DB 类库项目(DBDLL),专门封装数据库操作;
-
右键项目「添加引用」→浏览,选中 dll 文件导入;
-
代码头部引入命名空间:
using MySql.Data.MySqlClient;,无引用会全代码报错。
拓展规范
服务端、客户端共用 MyNet 网络库,数据库操作单独封装 DLL,分层解耦,业务层不直接写原生 SQL。
三、DBHelper 单例数据库工具类(核心封装)
1 设计思路
采用饿汉式单例,全局仅一个数据库连接实例,避免重复创建连接浪费资源;所有数据库操作统一封装方法,业务层无需手写原生 SQL。
2 核心配置参数
// 数据库连接字符串关键配置
string connStr = "server=127.0.0.1;port=3306;database= ;user= ;password= ";
server:本机回环地址 127.0.0.1;
port:固定 3306;
database:刚刚创建的库名;
user/pwd:数据库账号密码。
3 DBHelper 内置全套方法
1)Init () 初始化数据库连接
程序启动时调用,建立与 MySQL 长连接,连接失败抛出日志提示。
2)CreateTable (string tableName, 字段配置)
自动创建数据表,游戏玩家表固定结构;
类比 Excel:表名 = 工作表,字段 = 表头,每行 = 单条玩家数据。
玩家 UserTable 标准字段:
| 字段名 | 类型 | 作用 | 特性 |
|---|---|---|---|
| UserId | int | 玩家唯一 ID | 自增主键,自动累加 1、2、3 |
| UserName | varchar(100) | 登录账号 | 不可重复 |
| Password | varchar(100) | 登录密码 | |
| NickName | varchar(100) | 游戏昵称 | |
| Lv | int | 玩家等级 | 默认 0 |
| Gold | int | 金币 | 默认 0 |
| Diamond | int | 钻石 | 默认 0 |
3)AddColumn 扩展表字段
游戏版本更新新增属性(攻击力、公会 ID)时,动态追加列;
缺点:线上项目频繁改表会同步修改客户端实体,尽量前期预留字段。
4)InsertData 插入单条数据
注册账号核心方法,新玩家信息写入数据库生成新 UserId。
5)CheckExist (列名,值)
查询指定字段是否存在对应数据;注册时检测账号是否重复。
6)GetUserInfoByName(string account)
根据账号查询完整玩家信息,登录校验核心接口。
7)UpdateField 单字段更新
玩家升级、获取金币时,仅修改对应字段,无需覆盖整条数据。
8)DeleteData 按条件删除玩家数据
谨慎调用,线上游戏禁止随意删除账号数据。
4 线程安全补充
数据库操作方法内部加lock锁,多客户端并发注册 / 查询避免 SQL 并发错乱。
四、UserInfo 玩家实体类
1 概念
实体类和数据库表字段一一对应,作为数据库查询结果载体,服务端接收登录 / 注册消息后,转换为 UserInfo 对象处理业务。
完整实体结构
public class UserInfo{
public int UserId;
public string UserName;
public string Password;
public string NickName;
public int Lv;
public int Gold;
public int Diamond;
}
规范
数据库查询后自动填充实体所有字段,登录成功将 UserInfo 序列化发给 Unity 客户端,刷新大厅 UI(等级、金币展示)。
五、DBUser 业务数据库操作类(服务端专用)
1 定位
封装游戏业务专属数据库逻辑,基于底层 DBHelper 二次封装,分离底层 SQL 与业务注册 / 登录逻辑。
核心业务方法
-
bool CheckAccountExist(string acc)检测账号是否已注册,返回 true = 账号存在,注册拦截; -
int Register(string acc, string pwd, string nick)新账号插入数据库,返回 0 成功、1 账号重复失败; -
UserInfo LoginCheck(string acc, string pwd)根据账号查询数据,密码匹配返回完整玩家信息;账号不存在 / 密码错误返回 null; -
void UpdateUserLv(int uid, int newLv)玩家升级更新数据库等级; -
void UpdateGold(int uid, int goldNum)充值、任务奖励更新金币。
2 服务端初始化流程
-
程序启动优先调用
DBHelper.Instance.Init()连接数据库; -
再启动 TCP 监听,防止未连库就接收客户端注册消息;
-
全局单例调用
DBUser.Instance执行数据库业务。
六、登录 / 注册完整数据库业务流程
1 注册全流程
1 Unity 客户端发送 C2S_REG 消息(账号、密码、昵称);
2 服务端收到消息,调用DBUser.CheckAccountExist();
3 账号已存在:返回 S2C_REG_RESP Result=1(注册失败,弹窗提示账号重复);
4 账号不存在:执行 Register 插入数据库,返回 Result=0,注册成功自动登录跳转大厅。
2 登录全流程
1 客户端发送 C2S_LOGIN(账号 + 密码);
2 服务端调用DBUser.LoginCheck(账号);
3 返回 UserInfo 为空:账号不存在,返回错误码;
4 实体存在但密码不匹配:返回登录失败;
5 账号密码全部匹配:将 UserInfo 封装进回复消息下发客户端,大厅加载玩家数据。
七、服务端代码分层依赖关系
1 底层 DBDLL:MySql 驱动 + DBHelper(原生 SQL 封装);
2 业务层 DBUser:基于 DBHelper 封装游戏注册 / 登录;
3 LoginServer 服务端:引入 DBUser,处理网络消息 + 数据库交互;
4 客户端 Unity:仅收发消息,不直接操作数据库,所有数据校验交给服务端(防外挂作弊)。
核心安全拓展
客户端无法直接读写数据库,所有账号、金币、等级校验逻辑放在服务端数据库,杜绝本地修改数据作弊。
八、高频报错与解决方案
-
MySql.Data.dll 引用报错:未添加项目引用、命名空间未 using;
-
数据库连接失败:MySQL 服务未启动、端口 3306 被占用、库名 / 账号密码写错;
-
注册重复账号未拦截:CheckExist 查询逻辑遗漏;
-
登录返回空:数据库密码字段和客户端传入密码不匹配;
-
消息接收数组越界:消息处理后 Uid 未重置,连续收发下标错乱;
-
数据库未初始化就处理消息:服务端启动顺序颠倒,先连库再开监听。
九、拓展
1 MySQL5.7 小皮一键部署流程,3306 端口作用;
2 DBHelper 单例设计优势,并发数据库操作加锁必要性;
3 玩家数据表字段设计思路,自增主键 UserId 作用;
4 注册账号查重业务逻辑,登录密码校验流程;
5 分层设计:底层数据库工具与业务操作分离;
6 游戏安全规范:数据库操作全部放在服务端,客户端无权读写库;
7 实体类 UserInfo 与数据库表一一映射的设计意义;
8 线上项目数据表优化建议:前期预留扩展字段,避免频繁 Alter 改表。