书刊介绍
《Unity3D 网络游戏实战》内容简介
深入讲解Unity3D网络游戏开发的原理和实现细节,全面剖析游戏网络框架设计。
·实战性强,以多人坦克对战游戏案例贯穿全书,详述网络游戏的开发过程,帮助读者掌握商业游戏的设计思路和实现方法。
本书先提出了一个明确的学习目标,即制作一款完整的多人对战游戏,然后逐步去实现它。全书涉及行走控制、人工智能系统、界面系统、服务端框架、客户端框架、房间系统、战场系统等多项内容。在涉及相关知识点时,书中会有详细的讲解。具体来说,本书分为如下3个部分。第一部分“单机游戏”:第1章至第5章,主要介绍如何开发一款功能完整的坦克单机游戏。除了让坦克行走、开炮,还将介绍基于代码和资源分离的界面系统、敌人AI。了解开发单机游戏的知识,也是为接下来的网络开发学习奠定基础。第二部分“网络原理”:第6章至第8章,主要介绍网络通信的原理,开发客户端的网络模块和服务端程序框架。这套框架具有较高的通用性,可以运用在多种游戏上。第三部分“网络游戏”:第9章至第12章,主要讲解房间系统和同步系统的逻辑实现,将单机坦克游戏改造成多人对战的网络游戏。作为实例教程,本书偏重于例子中涉及的知识点。如果读者想要深入了解某些内容,或者了解实现某种功能的更多方法,建议在阅读本书的过程中多多查询相关资料,以便做到举一反三。作品目录
前言
第1章:掌握Unity3D基本元素
1.1、最最简单的游戏
1.1.1、Unity3D的界面构成
1.1.2、在场景中创建立方体
1.1.3、编写第一个程序
1.1.4、测试游戏
1.1.5、总结
1.2、导入资源
1.2.1、从本地导入素材
1.2.2、从本地导入包文件
1.2.3、从AssetStore导入
1.3、山体系统
1.4、灯光
1.5、材质
1.5.1、什么是材质
1.5.2、如何创建材质
1.5.3、Mesh
Renderer组件
1.5.4、着色器
1.6、预设
1.6.1、制作预设
1.6.2、预设的实例化
1.6.3、使用预设的例子
1.7、声音
1.7.1、音源
1.7.2、接收器
1.7.3、简单播放器
1.8、GUI
1.8.1、GUI绘图基础
1.8.2、编写HelloWorld程序
1.8.3、绘制登录框
1.9、场景
1.9.1、创建场景
1.9.2、场景切换
1.10、导出游戏
第2章:坦克控制单元
2.1、导入坦克模型
2.1.1、导入模型
2.1.2、调整尺寸
2.1.3、材质和贴图
2.2、行走控制
2.2.1、基础知识
2.2.2、上下左右移动
2.2.3、转向和前后移动
2.3、相机跟随
2.3.1、数学原理
2.3.2、跟随算法
2.3.3、设置跟随目标
2.3.4、横向旋转相机
2.3.5、纵向旋转相机
2.3.6、滚轮调节距离
2.4、旋转炮塔
2.4.1、坦克的层次结构
2.4.2、炮塔
2.4.3、炮管
2.5、车辆行驶
2.5.1、Unity3D的物理系统
2.5.2、车轮碰撞器
2.5.3、控制车辆
2.5.4、制动(刹车)
2.6、轮子和履带
2.6.1、轮子转动
2.6.2、履带滚动
2.7、音效
第3章:火炮与敌人
3.1、发射炮弹
3.1.1、制作炮弹
3.1.2、制作爆炸效果
3.1.3、炮弹轨迹
3.1.4、坦克开炮
3.2、摧毁敌人
3.2.1、坦克的控制类型
3.2.2、坦克的生命值
3.2.3、焚烧特效
3.2.4、坦克被击中后的处理
3.2.5、炮弹的攻击处理
3.3、准心
3.3.1、概念和原理
3.3.2、计算目标射击位置
3.3.3、计算实际射击位置
3.3.4、绘制准心
3.4、绘制生命条
3.4.1、生命条素材
3.4.2、绘制生命条
3.5、击杀提示
3.5.1、谁发射了炮弹
3.5.2、谁被击中
3.5.3、显示击杀提示
3.6、炮弹的音效
3.6.1、发射音效
3.6.2、爆炸音效
第4章:人工智能
4.1、基于有限状态机的人工智能
4.1.1、有限状态机
4.1.2、分层有限状态机
4.2、程序结构
4.2.1、AI类的结构
4.2.2、在Tank中调用
4.3、搜寻目标
4.3.1、搜寻规则
4.3.2、坦克标签
4.3.3、主动搜寻算法
4.3.4、被动搜寻算法
4.3.5、调试
4.4、向敌人开炮
4.4.1、电脑控制的方式
4.4.2、炮塔炮管的目标角度
4.4.3、调试程序
4.4.4、开炮
4.5、走向目的地
4.5.1、路点
4.5.2、路径
4.5.3、根据场景标志物生成路径
4.5.4、给AI指定路径
4.5.5、操控坦克
4.5.6、调试程序
4.6、使用NavMesh计算路径
4.6.1、NavMesh的原理
4.6.2、生成导航图
4.6.3、生成路径
4.7、行为决策
4.7.1、巡逻状态
4.7.2、进攻状态
4.7.3、调试
4.8、战场系统
4.8.1、单例模式
4.8.2、BattleTank
4.8.3、战场逻辑
4.8.4、敌我区分
4.8.5、出生点
4.8.6、坦克预设
4.8.7、开启一场两军对峙的战斗
4.8.8、战场结算
4.8.9、开始战斗
第5章:代码分离的界面系统
5.1、Unity
UI系统
5.1.1、创建UI部件
5.1.2、Canvas画布
5.1.3、EventSystem
5.1.4、RectTransform
5.1.5、其他UGUI组件
5.1.6、事件触发
5.1.7、简单的面板调用
5.2、制作界面素材
5.2.1、标题面板和信息面板
5.2.2、制作预设
5.3、面板基类PanelBase
5.3.1、代码与资源分离的优势
5.3.2、面板系统的设计
5.3.3、面板基类的设计要点
5.3.4、面板基类的实现
5.4、面板管理器PanelMgr
5.4.1、层级管理
5.4.2、打开面板OpenPanel
5.4.3、关闭面板ClosePanel
5.5、面板逻辑
5.5.1、标题面板TitlePanel
5.5.2、信息面板InfoPanel
5.6、调用界面系统
5.6.1、界面系统的资源
5.6.2、界面系统的调用
5.7、胜负面板
5.7.1、面板素材
5.7.2、面板逻辑
5.7.3、面板调用
5.8、设置面板
5.8.1、面板素材
5.8.2、面板逻辑
5.8.3、面板调用
第6章:网络基础
6.1、七层网络模型
6.1.1、应用层
6.1.2、传输层
6.1.3、网络层
6.1.4、数据链路层
6.1.5、物理层
6.2、IP与端口
6.2.1、IP地址
6.2.2、端口
6.2.3、C#中的相关类型
6.3、TCP协议
6.3.1、TCP连接的建立
6.3.2、TCP的数据传输
6.3.3、TCP连接的终止
6.4、Socket套接字
6.4.1、Socket连接的流程
6.4.2、Socket类
6.5、同步Socket程序
6.5.1、新建控制台程序
6.5.2、编写服务端程序
6.5.3、客户端界面
6.5.4、客户端程序
6.6、异步Socket程序
6.6.1、BeginAccept
6.6.2、BeginReceive
6.6.3、Conn(state)
6.6.4、服务端程序(主体结构)
6.6.5、服务端程序(Accept回调)
6.6.6、服务端程序(接收回调)
6.6.7、开启服务端
6.6.8、客户端界面
6.6.9、客户端程序
6.6.10、调试程序
6.7、MySQL
6.7.1、配置MySQL环境
6.7.2、建立MySQL数据库
6.7.3、MySQL基础知识
6.7.4、MySQL留言板服务端程序
6.7.5、调试程序
6.8、类的序列化
6.9、定时器
6.10、线程互斥
6.11、通信协议和消息列表
6.11.1、通信协议
6.11.2、服务端程序
6.11.3、消息列表
6.11.4、客户端场景
6.11.5、客户端程序
6.11.6、调试
第7章:服务端框架
7.1、服务端架构
7.1.1、总体架构
7.1.2、游戏流程
7.1.3、连接的数据结构
7.1.4、数据库结构
7.1.5、项目结构
7.2、数据管理类DataMgr
7.2.1、数据表结构
7.2.2、角色数据
7.2.3、Player的初步版本
7.2.4、连接数据库
7.2.5、防止sql注入
7.2.6、Register注册
7.2.7、CreatePlayer创建角色
7.2.8、登录校验
7.2.9、获取角色数据
7.2.10、保存角色数据
7.2.11、调试
7.3、临时数据
7.4、网络管理类ServNet
7.4.1、粘包分包现象
7.4.2、粘包分包的处理方法
7.4.3、Conn连接类
7.4.4、ServNet网络处理类
7.4.5、ReceiveCb的粘包分包处理
7.4.6、发送消息
7.4.7、启动服务端
7.4.8、调试
7.5、心跳
7.5.1、心跳机制
7.5.2、时间戳
7.5.3、使用定时器
7.5.4、心跳协议
7.5.5、调试心跳协议
7.6、协议
7.6.1、协议基类
7.6.2、字符串协议
7.6.3、字节流协议
7.6.4、字节流辅助方法
7.6.5、使用协议
7.6.6、调试
7.7、中间层Player类
7.7.1、登录流程
7.7.2、下线
7.7.3、Player类的实现
7.8、消息分发
7.8.1、消息处理的类
7.8.2、消息处理类的实现
7.8.3、反射
7.9、注册登录
7.9.1、协议
7.9.2、注册功能
7.9.3、登录功能
7.9.4、登出功能
7.9.5、获取分数功能
7.9.6、增加分数功能
7.9.7、输出服务端信息
7.9.8、Main中的调用
7.9.9、测试用客户端
7.9.10、调试
第8章:客户端网络模块
8.1、网络模块设计
8.1.1、整体架构
8.1.2、监听表
8.1.3、类结构
8.2、委托
8.2.1、使用委托
8.2.2、示例
8.2.3、操作符
8.3、MsgDistribution消息分发
8.3.1、MsgDistribution的成员
8.3.2、DispatchMsgEvent
8.3.3、AddListener
8.4、Connection连接
8.4.1、Connection的成员
8.4.2、连接服务端
8.4.3、关闭连接
8.4.4、异步回调
8.4.5、消息处理
8.4.6、发送数据
8.4.7、心跳机制
8.5、NetMgr网络管理
8.6、登录注册功能
8.6.1、界面资源
8.6.2、登录面板功能
8.6.3、注册面板功能
8.7、位置同步的服务端程序
8.7.1、协议
8.7.2、场景
8.7.3、协议处理
8.7.4、事件处理
8.8、位置同步的客户端程序
8.8.1、客户端资源
8.8.2、客户端程序
8.9、调试框架
第9章:房间系统
9.1、游戏界面
9.1.1、登录面板
9.1.2、注册面板
9.1.3、提示面板
9.1.4、UGUI的滑动区域
9.1.5、房间列表面板
9.1.6、房间面板
9.1.7、创建预设
9.2、协议设计
9.3、提示框的功能实现
9.4、登录注册的功能实现
9.4.1、登录面板的功能
9.4.2、GameMgr
9.4.3、注册面板的功能
9.4.4、调试
9.5、房间列表面板的功能
9.5.1、获取部件
9.5.2、开启监听
9.5.3、刷新成绩栏
9.5.4、刷新房间列表
9.5.5、刷新按钮
9.5.6、加入房间
9.5.7、新建房间
9.5.8、登出
9.5.9、测试面板
9.6、房间面板的功能
9.6.1、获取部件
9.6.2、监听
9.6.3、刷新列表
9.6.4、退出按钮
9.6.5、开始战斗
9.6.6、测试面板
第10章:房间系统服务端
10.1、玩家数据
10.2、房间类
10.2.1、数据结构
10.2.2、添加玩家
10.2.3、删除玩家
10.2.4、更换房主
10.2.5、广播消息
10.2.6、输出房间信息
10.3、房间管理器
10.3.1、数据结构
10.3.2、创建房间
10.3.3、离开房间
10.3.4、输出房间列表
10.4、玩家消息处理
10.4.1、查询成绩GetAchieve
10.4.2、获取房间列表GetRoomList
10.4.3、创建房间CreateRoom
10.4.4、加入房间EnterRoom
10.4.5、获取房间信息GetRoomInfo
10.4.6、离开房间LeaveRoom
10.5、玩家事件处理
10.6、调试
第11章:战场系统
11.1、协议设计
11.2、开始战斗
11.2.1、客户端战场数据
11.2.2、获取阵营
11.2.3、清理场景
11.2.4、开始战斗
11.2.5、产生坦克
11.2.6、服务端战场数据
11.2.7、服务端条件检测
11.2.8、服务端开启战斗
11.2.9、服务端消息处理
11.2.10、调试程序
11.3、三种同步位置方案
11.3.1、瞬移式位置同步
11.3.2、移动式位置同步
11.3.3、预测式位置同步
11.4、位置同步的服务端处理
11.5、位置同步的客户端处理
11.5.1、发送同步信息
11.5.2、网络同步类型
11.5.3、预测目标位置
11.5.4、向目标位置移动
11.5.5、监听服务端协议
11.5.6、调试
11.6、同步炮塔炮管
11.7、轮子和履带
第12章:炮火同步
12.1、炮弹同步
12.1.1、协议设计
12.1.2、服务端处理
12.1.3、客户端发送同步信息
12.1.4、客户端接收同步信息
12.2、伤害同步
12.2.1、协议设计
12.2.2、服务端处理
12.2.3、客户端发送伤害信息
12.2.4、客户端接收伤害信息
12.3、胜负判断
12.3.1、协议设计
12.3.2、服务端胜负判断
12.3.3、服务端处理战斗结果
12.3.4、客户端接收战斗结果
12.4、中途退出
12.5、完整的游戏