HOME
BLOG
MMORPG
10月 16 2022

开发环境

  • Unity版本编辑器

  • VS

  • SQL

  • Git


开发目录规划

创建目录 - 合理划分、便于管理

  • Art

  • Doc

  • Src

  • Tools

创建版本库 - 便于协作、版本追溯


项目准备

  • 文档

    • 策划文档

    • 美术规范

    • 技术文档

  • 工具

    • 配置表工具

      • 如 Excel、二进制格式、CSV格式
    • 协议工具

      • 如 ProtoBuf
    • 其他工具

  • 框架

    • 客户端

      • 日志 - 易于使用、配置灵活 - 通用组件

      • 配置 - 保存、读取、分辨率、关卡进度等等

      • 数据加载 - 配置表、角色表、怪物表、等级表、掉落表等等

      • 网络

      • 基础组件 - 各种单例类等等

    • 服务器(服务端)

      • 日志

      • 配置

      • 数据加载

      • 网络

      • DB访问(数据库访问)

      • 基础组件

  • 协议

    • Google Protobuf

    • 协议创建

    • 协议生成


筹备环节

  • 资源准备

  • 客户端环境准备

    • 美术资源准备

    • 各类资源导入

    • 基本场景搭建

    • 环境测试

  • 服务器环境准备

    • 准备项目

      • 公共类库

      • 引用组件

    • 环境测试

      • DB访问测试

      • 数据库生成

  • 协议环境准备

    • 文档准备

      • 协议使用方案

      • 协议编写

      • 代码生成测试


网络消息处理

通讯组件(依据情况)

  • NetworkClient & TcpSocketListener

  • 封包处理器 PackageHandler

  • 消息分发器 MessageDistributer

  • 消息分配处理 MessageDispatch

网络消息处理通信与协议_Break The Sky的博客-CSDN博客

socket编程入门:1天玩转socket通信技术(非常详细)

阻塞与非阻塞的区别 - 麦飞 - 博客园


protobuf协议 - 相关链接


| 生成数据库:

  1. 右键 - 新增 - 实体

  2. 属性 - 右键 - 标量属性

  3. 右键 - 根据模型生成数据库 - 全部是是是

  4. 在 SQL Server Management 里【执行】 .sql 文件 - 然后表就会更新过去

| 生成协议编译成功:

如:注册加一个年龄

  1. 修改 - 如先加一个新字段:在UserRegisterRequest 【+】int32 age = 3;

  2. 生成:Tools - genproto.cmd

  3. 查看:Src - Lib - Protocol - message.cs - 可以用git diff看到新增的内容

  4. 可以直接使用此类了


| 客户端发送消息到服务器

编写流程:

一. GameServer.cs - 服务监听

  1. class GameServer + NetService network;

  2. public bool Init(){} + network = new NetService(); and network.Init(8000);

  3. public void Start() + network.Start();

  4. public void Stop() + network.Stop();

  5. 执行一下

二. 自建文件 - 初始化和链接到服务器

void Start () 添加了

Network.NetClient.Instance.Init("127.0.0.1", 8000);

Network.NetClient.Instance.Connect();

三. message.proto - 修改协议

  1. message NetMessageRequest 添加 FirstTestRequest firstRequestr = 10;

  2. 新写一个 message FirstTestRequest { string helloworld = 1; }

  3. 先到服务器 - 右键选择解决方案 - 生成解决方案

  4. 将 \Src\Lib\Protocol\bin\Debug 下的四个文件粘贴到 \Src\Client\Assets\References 替换更新


系统框架

  • UI Layer

    -

  • Logic Layer

  • Network

  • Data Transfer(会用)


协议:NCharacter

实体:Character

DB:TCharacter


地图服务(客户端)

角色管理器(客户端)

游戏对象管理器

玩家控制器

主角摄像机


网址推荐:Creating a World Space UI | Unity UI | 1.0.0


小地图

  • 小地图的资源制作

    • 实时渲染场景 - 【摄像机挂在上空 - 影响性能 - 写实性高】

    • 预渲染顶视图 + 润色 -【用的较多】

    • 纯美术制作

  • 小地图的 UI 元素

  • 小地图的配置与加载 - 如下

  • 小地图与场景的坐标映射


小地图的配置与加载?

  • \Src\Data\Tables 下的 MapDefine.xlsx 文件 –> 修改Name + 添加一个字段(右键插入 - 修改即可)

  • 运行 \Src\Data 下的 Excel2Json.cmd 【右键编辑可以看到操作的事】

  • 到 GameServer 的 Common\Data\MapDefine.cs 中把新加的字段添加进去

  • 右键【生成解决方案】

  • \Src\Lib\Common\bin\Debug 下复制 Common.dll(pdb) 【只改Data可以只复制Common这俩,后面四个是协议内容】 + protobuf-net.dll(xml) + protocol.dll(pdb)

  • 粘贴到 \Src\Client\Assets\References 替换掉


移动同步

状态同步 或叫 事件同步(守望先锋) 和 帧同步(Dota、星际等)

同步什么?

如:

  • 位置 - Position、Direction、Speed

  • 状态:Idle、Move、Jump、Attack

  • 基本属性:Name、Hp、Mp

  • 扩展信息:工会、外观、装备、详细属性等


  • 同步的目标对象

    • Nentity:Position、Direction、Speed

    • Entity:position、direction、Speed

    • EntityController:Transform.position、Transform.forward

  • 同步的流程

  • EntitySync 协议

  • EntitySync 的发送与响应


BUG

  1. 反复进入主城,角色不同步

    1. 【C】UICharacterSelect & Entity & MapService & UserService

    2. 【S】UserService & Map & CharacterManager

  2. 小地图找不到角色报错

    1. 【C】UIMinimap & MinimapManager
  3. 单例对象重复执行问题

    1. 【C】MonoSingleton

地图传送

  1. 创建传送点

  2. 传送点的配置

  3. 编辑器扩展:传送点数据生成

  4. 传送协议与实现


森木清树
Unity Study