【实战】Unity3d实战之Unity3d网络游戏实战篇(5):MySql基础以及类的序列化

Unity3d实战之Unity3d网络游戏实战篇(5):MySql基础以及类的序列化

学习书籍《Unity3d网络游戏实战》 罗培羽著 机械工业出版社
本文是作者在学习过程中遇到的认为值得记录的点,因此引用的代码等资源基本出资罗培羽老师的书籍
以下为个人的学习简记,与诸君共论 由于U3D的官方案例Tank Tutorial中对坦克的基本操作已经有了详尽的描述,因此本文着重于面板系统、服务端基本网络框架和客户端基本网络框架的搭建
如有疑问或者描述错误的地方,欢迎各位提出或修正,讨论交流是获取和巩固知识的重要途径之一!

MySQL
 管理员权限下打开powershell:
 开启MYSQL服务:
  net start mysql57
 关闭MYSQL服务
  ner stop mysql57
 mysql -u root -p
 [password]

 创建数据库
  CREATE DATABASE [DATABASE NAME];
 查看数据库
  SHOW DATABASE;
 选择数据库
  USE [DATABASE NAME];

 查看表
  SHOW TABLES;
 查看表属性
  SHOW COLUMNS FROM [TABLE NAME]:
 查看表索引
  SHOW INDEX FROM [TABLE NAME];
 创建表
  CREATE TABLE [TABLE NAME];
 删除表
  DROP TABLE [TABLE NAME]
 清空表(清空表中所有数据)
  TRUNCATE TABLE [TABLE NAME]

数据操作:
 插入数据:
  INSERT INTO [TABLE NAME]
  SET [PROPERTY1]=[VALUE1],[PROPERTY2]=[VALUE2],..
 删除数据:
  DELETE FROM [TABLE NAME]
  WHERE [PROPERTY] = [VALUE]
 更新数据:
  UPDATE [TABLE NAME]
  SET [PROPERTY] = [VALUE]
  WHERE [PROPERTY] = [VALUE]

创建名为game的数据库并建立两个表:
【实战】Unity3d实战之Unity3d网络游戏实战篇(5):MySql基础以及类的序列化_第1张图片
【实战】Unity3d实战之Unity3d网络游戏实战篇(5):MySql基础以及类的序列化_第2张图片
使用C#连接MySQL数据库需要引用相关的命名空间。

using MySql.Data;
using MySql.Data.MySqlClient;

建立MySQL连接

string connStr = "Database=game;DataSource=127.0.0.1;";
connStr += "User Id=root;Password=123456;port=3306;";

sqlConn = new MySqlConnection (connStr);
sqlConn.Open();

使用SQL语句,并进行数据查询,并将歘讯结果存入数据集中MySqlDataReader中。

string formatStr = "select * from user where id='{0}' and pw='{1}';";
string cmdStr = string.Format (formatStr, id, pw);
MySqlCommand cmd = new MySqlCommand (cmdStr, sqlConn);

MySqlDataReader reader = cmd.ExecuteReader();

类的序列化
 通常我们需要将玩家的数据保存到数据库中,这是我们可以使用序列化。
 标记一个类使其可以序列化的方法:

[Serializable]          // Mark a class, so the class is serializable
public class PlayerData
{
    public int score = 0;
    public int win = 0;
    public int fail = 0;
}

 序列化一个类并将其存入数据库中:
 注意需要在脚本头加入
 

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
PlayerData playerData = new PlayerData();
IFormatter formatter = new BinaryFormatter ();
MemoryStream stream = new MemoryStream ();

formatter.Serialize(stream,playerData);

byte[] byteArr = stream.ToArray ();
string formatStr = "update player set data=@data where id='{0}';";
string cmdStr = string.Format (formatStr, id);
MySqlCommand cmd = new MySqlCommand (cmdStr, sqlConn);
cmd.Parameters.Add ("@data", MySqlDbType.Blob);
cmd.Parameters [0].Value = byteArr;

cmd.ExecuteNonQuery();

既然有序列化那当然有反序列化,使用反序列化将数据还原为一个类对象:

string formatStr = "select * from player where id='{0}';";
string cmdStr = string.Format (formatStr, id);
MySqlCommand cmd = new MySqlCommand (cmdStr, sqlConn);
byte[] byteArr = new byte[1];

MySqlDataReader reader = cmd.ExecuteReader();
reader.Read();

long len = reader.GetBytes(1, 0, null, 0, 0);
byteArr = new byte[len];
reader.GetBytes(1, 0, byteArr, 0, (int)len);
reader.Close();

PlayerData playerData = null;
IFormatter formatter = new BinaryFormatter ();
MemoryStream stream = new MemoryStream (byteArr);

playerData = (PlayerData)formatter.Deserialize(stream);

下一节:搭建服务端框架

你可能感兴趣的:(实战集,Unity3d)