| 作者 |
| 迈克·吉格(Mike Geig)罗培羽 |
| 丛书名 |
| 游戏开发与设计技术丛书 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9787190801162 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------Unity游戏开发(原书第3版)--------------------------- 本书主要介绍Unity 2018的使用和游戏开发流程中涉及的各种知识。每一章的结构特别清晰,先综述该章要介绍的内容,然后一步步深入讲解,中间穿插着很多动手做的实践操作,可以让读者加深对某个概念、方法的理解,每章的最后还有一个小测验和一个稍微大一点的实践练习,用于巩固该章的学习内容。阅读每一章平均需要一个小时左右,每一章的内容都构建在前一章的基础之上。书中还穿插了四个实战项目,一来可以加强前面几章的学习,二来在整书阅读完毕之后,可以看到自己的读书成果。 ---------------------------Unity3D网络游戏实战(第2版)--------------------------- 本书针对第1版进行改版,将“单机游戏”融入到网络部分的实例中,在讲解网络通信原理的同时,给出各个知识点的案例,并开发客户端的网络模块和服务端程序框架。然后将一部分的坦克游戏改造成联网对战的多人游戏。本书基于Unity3D最新版本编写,书中例子为商业游戏简化版本,读者可以从中了解商业游戏的设计思路和实现方法。读者看完本书,初步拥有开发一款完整网络游戏的能力。 |
| 目录 |
---------------------------Unity游戏开发(原书第3版)--------------------------- 译者序 前言 第1章 Unity介绍1 1.1 Unity安装1 1.2 熟悉Unity编辑器3 1.2.1 Project对话框4 1.2.2 Unity界面5 1.2.3 Project视图7 1.2.4 Hierarchy视图9 1.2.5 Inspector 视图10 1.2.6 Scene视图11 1.2.7 Game视图12 1.2.8 隆重介绍:工具条13 1.3 在Unity 场景视图中导航14 1.3.1 Hand工具14 1.3.2 Flythrough模式15 1.4 本章小结16 1.5 问答16 1.6 测验16 1.7 练习17 第2章 游戏对象18 2.1 维度和坐标系18 2.1.1 3D中的D18 2.1.2 使用坐标系19 2.1.3 世界坐标系和本地坐标系20 2.2 游戏对象21 2.3 变换22 2.3.1 平移22 2.3.2 旋转23 2.3.3 缩放25 2.3.4 变换的风险25 2.3.5 小工具的位置26 2.3.6 变换和嵌套的对象27 2.4 本章小结28 2.5 问答28 2.6 测验28 2.7 练习29 第3章 模型、材质和纹理30 3.1 模型的基础知识30 3.1.1 内置的3D对象31 3.1.2 导入模型32 3.1.3 模型和Asset Store33 3.2 纹理、着色器和材质35 3.2.1 纹理35 3.2.2 着色器36 3.2.3 材质36 3.2.4 着色器进阶37 3.3 本章小结39 3.4 问答39 3.5 测验40 3.6 练习40 第4章 地形和环境42 4.1 地形的生成42 4.1.1 将地形添加到项目中42 4.1.2 高度图制作43 4.1.3 Unity地形制作工具45 4.2 地形纹理47 4.2.1 导入纹理资源48 4.2.2 纹理化地形49 4.3 生成树和草51 4.3.1 绘制树木51 4.3.2 绘制青草52 4.3.3 地形设置54 4.4 角色控制器56 4.5 本章小结57 4.6 问答57 4.7 测验57 4.8 练习58 第5章 灯光和摄像机59 5.1 灯光59 5.1.1 烘焙灯光和实时灯光60 5.1.2 点光源60 5.1.3 聚光灯62 5.1.4 定向光63 5.1.5 利用对象创建灯光64 5.1.6 光晕64 5.1.7 Cookie65 5.2 摄像机66 5.2.1 摄像机介绍66 5.2.2 多个摄像机67 5.2.3 屏幕分拆和画中画68 5.3 图层70 5.3.1 图层介绍70 5.3.2 使用图层71 5.4 本章小结73 5.5 问答73 5.6 测验74 5.7 练习74 第6章 游戏案例1:Amazing Racer75 6.1 设计75 6.1.1 理念75 6.1.2 规则76 6.1.3 需求76 6.2 创建游戏世界77 6.2.1 制作地形77 6.2.2 添加环境78 6.2.3 雾效79 6.2.4 天空盒79 6.2.5 角色控制器80 6.3 游戏化80 6.3.1 添加游戏控制对象81 6.3.2 添加脚本82 6.3.3 将脚本连在一起84 6.4 游戏测试84 6.5 本章小结86 6.6 问答86 6.7 测验86 6.8 练习87 第7章 脚本(上)88 7.1 脚本88 7.1.1 创建脚本89 7.1.2 添加脚本91 7.1.3 分析脚本的基本内容92 7.1.4 using部分92 7.1.5 类声明部分93 7.1.6 类内容93 7.2 变量94 7.2.1 创建变量94 7.2.2 变量作用域95 7.2.3 公共和私有96 7.3 运算符96 7.3.1 算术运算符96 7.3.2 赋值运算符97 7.3.3 相等运算符98 7.3.4 逻辑运算符98 7.4 条件99 7.4.1 if语句99 7.4.2 if/else语句100 7.4.3 if/else if语句100 7.5 迭代102 7.5.1 while循环102 7.5.2 for循环102 7.6 本章小结103 7.7 问答103 7.8 测验104 7.9 练习104 第8章 脚本(下)105 8.1 方法105 8.1.1 方法简介106 8.1.2 编写方法107 8.1.3 使用方法109 8.2 输入110 8.2.1 输入的基础知识110 8.2.2 输入脚本111 8.2.3 特定键的输入112 8.2.4 鼠标输入113 8.3 访问局部组件114 8.3.1 使用GetComponent115 8.3.2 访问Transform115 8.4 访问其他对象116 8.4.1 寻找其他对象116 8.4.2 修改对象组件118 8.5 本章小结119 8.6 问答119 8.7 测验120 8.8 练习120 第9章 碰撞121 9.1 刚体121 9.2 启用碰撞122 9.2.1 碰撞体122 9.2.2 物理材质124 9.3 触发器125 9.4 光线投射127 9.5 本章小结129 9.6 问答129 9.7 测验130 9.8 练习130 第10章 游戏案例2:Chaos Ball131 10.1 设计131 10.1.1 理念131 10.1.2 规则132 10.1.3 需求132 10.2 竞技场132 10.2.1 创建竞技场133 10.2.2 纹理化133 10.2.3 创建超级弹性材质134 10.2.4 完成竞技场制作135 10.3 游戏实体135 10.3.1 玩家135 10.3.2 混乱球136 10.3.3 彩球138 10.4 控制对象138 10.4.1 球门139 10.4.2 Game Manager140 10.5 优化游戏141 10.6 本章小结142 10.7 问答142 10.8 测验142 10.9 练习143 第11章 预设144 11.1 预设的基础知识144 11.1.1 预设相关的术语145 11.1.2 预设的结构145 11.2 使用预设146 11.2.1 向场景中添加预设实例149 11.2.2 继承149 11.2.3 中断预设之间的关联151 11.2.4 通过代码实例化预设151 11.3 本章小结151 11.4 问答152 11.5 测验152 11.6 练习152 第12章 2D游戏工具154 12.1 2D游戏的基础知识154 12.2 正交投影摄像机156 12.3 添加精灵158 12.3.1 导入精灵158 12.3.2 精灵模式158 12.3.3 导入精灵大小160 12.4 绘制顺序160 12.4.1 排序图层161 12.4.2 层级的顺序162 12.5 2D物理163 12.5.1 2D刚体163 12.5.2 2D碰撞体163 12.6 本章小结164 12.7 问答164 12.8 测验165 12.9 练习165 第13章 2D瓦片地图167 13.1 瓦片地图的基础知识167 13.1.1 创建一张瓦片地图167 13.1.2 网格169 13.2 调色板169 13.3 瓦片171 13.3.1 配置精灵171 13.3.2 创建瓦片172 13.3.3 绘制瓦片173 13.3.4 自定义调色板175 13.4 瓦片地图和物理176 13.4.1 瓦片地图碰撞体176 13.4.2 使用Composite Collider 2D组件178 13.5 本章小结178 13.6 问答179 13.7 测验179 13.8 练习179 第14章 用户界面180 14.1 UI的基本原则180 14.2 画布181 14.2.1 Rect Transform182 14.2.2 锚点182 14.2.3 其他Canvas组件185 14.3 UI元素185 14.3.1 图片185 14.3.2 文本186 14.3.3 按钮187 14.4 画布的渲染模式190 14.4.1 Screen Space-Overlay190 14.4.2 Screen Space-Camera191 14.4.3 World Space191 14.5 本章小结192 14.6 问答192 14.7 测验192 14.8 练习193 第15章 游戏案例3:Captain Blaster195 15.1 设计195 15.1.1 理念195 15.1.2 规则196 15.1.3 需求196 15.2 游戏世界196 15.2.1 摄像机197 15.2.2 背景197 15.2.3 游戏实体198 15.2.4 玩家198 15.2.5 陨石200 15.2.6 子弹201 15.2.7 触发器201 15.2.8 UI202 15.3 控制流203 15.3.1 游戏管理器203 15.3.2 陨石脚本205 15.3.3 陨石生成206 15.3.4 DestroyOnTrigger脚本207 15.3.5 ShipControl脚本207 15.3.6 Bullet脚本209 15.4 优化210 15.5 本章小结210 15.6 问答211 15.7 测验211 15.8 练习211 第16章 粒子系统212 16.1 粒子系统的基本知识212 16.1.1 粒子212 16.1.2 Unity粒子系统212 16.1.3 粒子系统控制器213 16.2 粒子系统模块214 16.2.1 默认模块215 16.2.2 Emission模块216 16.2.3 Shape模块216 16.2.4 Velocity over Lifetime模块217 16.2.5 Limit Velocity over Lifetime模块217 16.2.6 Inherit Velocity模块217 16.2.7 Force over Lifetime模块217 16.2.8 Color over Lifetime 模块218 16.2.9 Color by Speed模块218 16.2.10 Size over Lifetime模块218 16.2.11 Size by Speed模块219 16.2.12 Rotation over Lifetime模块219 16.2.13 Rotation by Speed模块219 16.2.14 External Forces模块219 16.2.15 Noise模块219 16.2.16 Collision模块220 16.2.17 Triggers模块222 16.2.18 Sub Emitter模块222 16.2.19 Texture Sheet 模块222 16.2.20 Lights模块222 16.2.21 Trails模块223 16.2.22 Custom Data模块223 16.2.23 Renderer模块223 16.3 Curves Editor224 16.4 本章小结225 16.5 问答225 16.6 测验225 16.7 练习226 第17章 动画227 17.1 动画的基础知识227 17.1.1 绑定227 17.1.2 动画228 17.2 动画类型228 17.2.1 2D动画228 17.2.2 创建动画230 17.3 动画工具231 17.3.1 动画窗口231 17.3.2 创建一个新的动画232 17.3.3 记录模式234 17.3.4 Curves Editor236 17.4 本章小结237 17.5 问答237 17.6 测验237 17.7 练习238 第18章 Animator239 18.1 Animator的基础知识239 18.1.1 回顾rigging240 18.1.2 导入模型241 18.2 配置资源242 18.2.1 rig准备242 18.2.2 动画准备243 18.3 创建一个Animator247 18.3.1 Animator视图249 18.3.2 Idle动画249 18.3.3 参数251 18.3.4 状态和混合树251 18.3.5 过渡253 18.4 编写Animator的脚本253 18.5 本章小结254 18.6 问答255 18.7 测验255 18.8 练习255 第19章 时间线256 19.1 时间线的基础知识256 19.1.1 剖析时间线257 19.1.2 创建时间线257 19.2 使用时间线259 19.2.1 时间线窗口259 19.2.2 时间线轨道260 19.2.3 时间线剪辑261 19.3 复杂的控制263 19.3.1 在轨道上混合剪辑263 19.3.2 针对时间线编程264 19.4 本章小结266 19.5 问答266 19.6 测验266 19.7 练习267 第20章 游戏案例4:Gauntlet Runner268 20.1 设计268 20.1.1 理念268 20.1.2 规则268 20.1.3 需求269 20.2 游戏世界269 20.2.1 场景269 20.2.2 Gauntlet270 20.2.3 滚动地面271 20.3 实体272 20.3.1 充电装置272 20.3.2 障碍物273 20.3.3 触发器区域274 20.3.4 玩家274 20.4 控制管理器275 20.4.1 触发器区域脚本275 20.4.2 游戏管理器脚本276 20.4.3 Player脚本278 20.4.4 碰撞脚本279 20.4.5 出生点脚本280 20.4.6 将游戏的各个部分组合在一起281 20.5 改进的空间282 20.6 本章小结282 20.7 问答282 20.8 测验283 20.9 练习283 第21章 音频284 21.1 音频的基础知识284 21.1.1 音频的组成部分284 21.1.2 2D和3D音频285 21.2 音频源285 21.2.1 导入音频剪辑286 21.2.2 在Scene视图中测试声音287 21.2.3 3D音频288 21.2.4 2D音频289 21.3 音频脚本289 21.3.1 开始或者停止播放音频289 21.3.2 修改音频剪辑291 21.4 音频混频器291 21.4.1 创建音频混频器291 21.4.2 将音频发送到混频器292 21.5 本章小结293 21.6 问答293 21.7 测验293 21.8 练习294 第22章 移动开发296 22.1 为移动开发做准备296 22.1.1 设置环境297 22.1.2 Unity Remote297 22.2 加速计299 22.2.1 针对加速计的设计300 22.2.2 使用加速计300 22.2.3 多点触摸输入301 22.3 本章小结303 22.4 问答303 22.5 测验303 22.6 练习304 第23章 优化和部署305 23.1 管理场景305 23.1.1 建立场景顺序306 23.1.2 切换场景307 23.2 保存数据和对象308 23.2.1 保存对象308 23.2.2 保存数据309 23.3 Unity玩家设置311 23.3.1 跨平台设置311 23.3.2 各个平台的设置312 23.4 构建游戏313 23.4.1 构建设置313 23.4.2 游戏设置314 23.5 本章小结315 23.6 问答315 23.7 测验316 23.8 练习316 第24章 结束语317 24.1 成果317 24.2 19小时的学习时间317 24.2.1 4个完整的游戏案例318 24.2.2 超过50个场景319 24.3 下一步怎么走319 24.3.1 制作游戏319 24.3.2 与人打交道319 24.3.3 记录320 24.4 可供使用的资源320 24.5 本章小结320 24.6 问答321 24.7 测验321 24.8 练习321 ---------------------------Unity3D网络游戏实战(第2版)--------------------------- 前言 第1章 网络游戏的开端:Echo 1 1.1 藏在幕后的服务端 1 1.2 网络连接的端点:Socket 3 1.2.1 Socket 3 1.2.2 IP地址 3 1.2.3 端口 4 1.2.4 Socket通信的流程 6 1.2.5 TCP和UDP协议 7 1.3 开始网络编程:Echo 8 1.3.1 什么是Echo程序 8 1.3.2 编写客户端程序 8 1.3.3 客户端代码知识点 10 1.3.4 完成客户端 11 1.3.5 创建服务端程序 12 1.3.6 编写服务端程序 14 1.3.7 服务端知识点 15 1.3.8 测试Echo程序 15 1.4 更多API 16 1.5 公网和局域网 17 第2章 分身有术:异步和多路复用 19 2.1 什么样的代码是异步代码 19 2.2 异步客户端 20 2.2.1 异步Connect 21 2.2.2 Show Me The Code 22 2.2.3 异步Receive 23 2.2.4 异步Send 26 2.3 异步服务端 29 2.3.1 管理客户端 29 2.3.2 异步Accept 30 2.3.3 程序结构 31 2.3.4 代码展示 31 2.4 实践:做个聊天室 35 2.4.1 服务端 35 2.4.2 客户端 35 2.4.3 测试 36 2.5 状态检测Poll 36 2.5.1 什么是Poll 36 2.5.2 Poll客户端 37 2.5.3 Poll服务端 38 2.6 多路复用Select 41 2.6.1 什么是多路复用 41 2.6.2 Select服务端 42 2.6.3 Select客户端 44 第3章 实践出真知:大乱斗游戏 45 3.1 什么是大乱斗游戏 45 3.2 搭建场景 46 3.3 角色类Human 49 3.3.1 类结构设计 49 3.3.2 BaseHuman 49 3.3.3 角色预设 51 3.3.4 CtrlHuman 54 3.3.5 SyncHuman 57 3.4 如何使用网络模块 57 3.4.1 委托 57 3.4.2 通信协议 59 3.4.3 消息队列 60 3.4.4 NetManager类 60 3.4.5 测试网络模块 64 3.5 进入游戏:Enter协议 66 3.5.1 创建角色 67 3.5.2 接收Enter协议 70 3.5.3 测试Enter协议 70 3.6 服务端如何处理消息 72 3.6.1 反射机制 72 3.6.2 消息处理函数 73 3.6.3 事件处理 74 3.6.4 玩家数据 76 3.6.5 处理Enter协议 77 3.7 玩家列表:List协议 77 3.7.1 客户端处理 78 3.7.2 服务端处理 79 3.7.3 测试 79 3.8 移动同步:Move协议 80 3.8.1 客户端处理 80 3.8.2 服务端处理 81 3.8.3 测试 81 3.9 玩家离开:Leave协议 82 3.9.1 客户端处理 82 3.9.2 服务端处理 82 3.9.3 测试 82 3.10 攻击动作:Attack协议 83 3.10.1 播放攻击动作 83 3.10.2 客户端处理 87 3.10.3 服务端处理 88 3.10.4 测试 88 3.11 攻击伤害:Hit协议 89 3.11.1 客户端处理 89 3.11.2 服务端处理 91 3.12 角色死亡:Die协议 91 3.12.1 客户端处理 91 3.12.2 测试 92 第4章 正确收发数据流 94 4.1 TCP数据流 94 4.1.1 系统缓冲区 94 4.1.2 粘包半包现象 96 4.1.3 人工重现粘包现象 97 4.2 解决粘包问题的方法 97 4.2.1 长度信息法 97 4.2.2 固定长度法 98 4.2.3 结束符号法 98 4.3 解决粘包的代码实现 99 4.3.1 发送数据 99 4.3.2 接收数据 99 4.3.3 处理数据 101 4.3.4 完整的示例 104 4.3.5 测试程序 106 4.4 大端小端问题 109 4.4.1 为什么会有大端小端之分 110 4.4.2 使用Reverse()兼容大小端编码 111 4.4.3 手动还原数值 111 4.5 完整发送数据 112 4.5.1 不完整发送示例 113 4.5.2 如何解决发送不完整问题 113 4.5.3 ByteArray和Queue 117 4.5.4 解决线程冲突 120 4.5.5 为什么要使用队列 121 4.6 高效的接收数据 122 4.6.1 不足之处 122 4.6.2 完整的ByteArray 123 4.6.3 将ByteArray应用到异步程序 129 第5章 深入了解TCP,解决暗藏问题 133 5.1 从TCP到铜线 133 5.1.1 应用层 133 5.1.2 传输层 134 5.1.3 网络层 135 5.1.4 网络接口 135 5.2 数据传输流程 136 5.2.1 TCP连接的建立 136 5.2.2 TCP的数据传输 137 5.2.3 TCP连接的终止 138 5.3 常用TCP参数 138 5.3.1 ReceiveBufferSize 138 5.3.2 SendBufferSize 139 5.3.3 NoDelay 139 5.3.4 TTL 140 5.3.5 ReuseAddress 141 5.3.6 LingerState 142 5.4 Close的恰当时机 144 5.5 异常处理 146 5.6 心跳机制 147 第6章 通用客户端网络模块 148 6.1 网络模块设计 148 6.1.1 对外接口 148 6.1.2 内部设计 149 6.2 网络事件 150 6.2.1 事件类型 151 6.2.2 监听列表 151 6.2.3 分发事件 152 6.3 连接服务端 152 6.3.1 Connect 152 6.3.2 ConnectCallback 154 6.3.3 测试程序 155 6.4 关闭连接 156 6.4.1 isClosing 157 6.4.2 Close 157 6.4.3 测试 158 6.5 Json协议 158 6.5.1 为什么会有协议类 158 6.5.2 使用JsonUtility 159 6.5.3 协议格式 160 6.5.4 协议文件 161 6.5.5 协议体的编码解码 162 6.5.6 协议名的编码解码 163 6.6 发送数据 165 6.6.1 Send 165 6.6.2 SendCallback 166 6.6.3 测试 167 6.7 消息事件 168 6.8 接收数据 170 6.8.1 新的成员 171 6.8.2 ConnectCallback 171 6.8.3 ReceiveCallback 172 6.8.4 OnReceiveData 172 6.8.5 Update 174 6.8.6 测试 175 6.9 心跳机制 176 6.9.1 PING和PONG协议 176 6.9.2 成员变量 177 6.9.3 发送PING协议 178 6.9.4 监听PONG协议 178 6.9.5 测试 179 6.10 Protobuf协议 179 6.10.1 什么是Protobuf 179 6.10.2 编写proto文件 180 6.10.3 生成协议类 181 6.10.4 导入protobuf-net.dll 183 6.10.5 编码解码 183 第7章 通用服务端框架 186 7.1 服务端架构 187 7.1.1 总体架构 187 7.1.2 模块划分 187 7.1.3 游戏流程 188 7.2 Json编码解码 189 7.2.1 添加协议文件 189 7.2.2 引用System.web.Extensions 190 7.2.3 修改MsgBase类 191 7.2.4 测试 192 7.3 网络模块 193 7.3.1 整体结构 193 7.3.2 ClientState 194 7.3.3 开启监听和多路复用 194 7.3.4 处理监听消息 196 7.3.5 处理客户端消息 197 7.3.6 关闭连接 198 7.3.7 处理协议 199 7.3.8 Timer 200 7.3.9 发送协议 201 7.3.10 测试 202 7.4 心跳机制 204 7.4.1 lastPingTime 204 7.4.2 时间戳 204 7.4.3 回应MsgPing协议 205 7.4.4 超时处理 205 7.4.5 测试程序 206 7.5 玩家的数据结构 206 7.5.1 完整的ClientState 206 7.5.2 PlayerData 208 7.5.3 Player 208 7.5.4 PlayerManager 209 7.6 配置MySQL数据库 211 7.6.1 安装并启动MySQL数据库 211 7.6.2 安装Navicat for MySQL 213 7.6.3 配置数据表 214 7.6.4 安装connector 215 7.6.5 MySQL基础知识 216 7.7 数据库模块 217 7.7.1 连接数据库 218 7.7.2 防止SQL注入 220 7.7.3 IsAccountExist 220 7.7.4 Register 221 7.7.5 CreatePlayer 223 7.7.6 CheckPassword 224 7.7.7 GetPlayerData 225 7.7.8 UpdatePlayerData 226 7.8 登录注册功能 226 7.8.1 注册登录协议 227 7.8.2 记事本协议 228 7.8.3 注册功能 229 7.8.4 登录功能 229 7.8.5 退出功能 231 7.8.6 获取文本功能 231 7.8.7 保存文本功能 231 7.8.8 客户端界面 232 7.8.9 客户端监听 233 7.8.10 客户端注册功能 235 7.8.11 客户端登录功能 235 7.8.12 客户端记事本功能 236 7.8.13 测试 236 第8章 完整大项目《坦克大战》 239 8.1 《坦克大战》游戏功能 239 8.1.1 登录注册 239 8.1.2 房间系统 240 8.1.3 战斗系统 241 8.2 坦克模型 242 8.2.1 导入模型 242 8.2.2 模型结构 243 8.3 资源管理器 245 8.3.1 设计构想 245 8.3.2 代码实现 245 8.3.3 测试 246 8.4 坦克类 246 8.4.1 设计构想 246 8.4.2 代码实现 246 8.4.3 测试 247 8.5 行走控制 248 8.5.1 速度参数 249 8.5.2 移动控制 249 8.5.3 测试 250 8.5.4 走在地形上 251 8.6 坦克爬坡 253 8.6.1 Unity的物理系统 253 8.6.2 添加物理组件 253 8.6.3 测试 254 8.7 相机跟随 255 8.7.1 功能需求 255 8.7.2 数学原理 255 8.7.3 编写代码 257 8.7.4 测试 258 8.8 旋转炮塔 260 8.8.1 炮塔元素 260 8.8.2 旋转控制 261 8.8.3 测试 262 8.9 发射炮弹 262 8.9.1 制作炮弹预设 262 8.9.2 制作爆炸效果 263 8.9.3 炮弹组件 264 8.9.4 坦克开炮 266 8.9.5 测试 268 8.10 摧毁敌人 269 8.10.1 坦克的生命值 269 8.10.2 焚烧特效 270 8.10.3 坦克被击中处理 271 8.10.4 炮弹的攻击处理 272 8.10.5 测试 272 第9章 UI界面模块 274 9.1 界面模块的设计 274 9.1.1 简单的界面调用 274 9.1.2 通用界面模块 275 9.2 场景结构 277 9.3 面板基类BasePanel 278 9.3.1 设计要点 278 9.3.2 代码实现 278 9.3.3 知识点 279 9.4 界面管理器PanelManager 281 9.4.1 层级管理 281 9.4.2 打开面板 282 9.4.3 关闭面板 284 9.5 登录面板LoginPanel 284 9.5.1 导入资源 284 9.5.2 UI组件 286 9.5.3 制作面板预设 286 9.5.4 登录面板类 289 9.5.5 打开面板 289 9.5.6 引用UI组件 290 9.5.7 网络监听 291 9.5.8 登录和注册按钮 293 9.5.9 收到登录协议 293 9.6 注册面板RegisterPanel 294 9.6.1 制作面板预设 294 9.6.2 注册面板类 296 9.6.3 按钮事件 298 9.6.4 收到注册协议 299 9.7 提示面板TipPanel 300 9.7.1 制作面板预设 300 9.7.2 提示面板类 301 9.7.3 测试面板 302 9.8 游戏入口GameMain 303 9.8.1 设计要点 303 9.8.2 代码实现 304 9.8.3 缓存用户名 305 9.9 功能测试 306 9.9.1 登录 306 9.9.2 注册 307 9.9.3 下线 309 第10章 游戏大厅和房间 310 10.1 列表面板预设 311 10.1.1 整体结构 311 10.1.2 个人信息栏 312 10.1.3 操作栏 312 10.1.4 房间列表栏 313 10.1.5 Scroll View 315 10.1.6 列表项Room 316 10.2 房间面板预设 318 10.2.1 整体结构 318 10.2.2 列表栏 319 10.2.3 列表项Player 320 10.2.4 控制栏 322 10.3 协议设计 322 10.3.1 查询战绩MsgGetAchieve协议 323 10.3.2 查询房间列表MsgGetRoom--List协议 323 10.3.3 创建房间MsgCreateRoom协议 324 10.3.4 进入房间MsgEnterRoom协议 324 10.3.5 查询房间信息MsgGetRoom-Info协议 324 10.3.6 退出房间MsgLeaveRoom协议 325 10.3.7 开始战斗MsgStartBattle协议 325 10.4 列表面板逻辑 326 10.4.1 面板类 326 10.4.2 获取部件 326 10.4.3 网络监听 328 10.4.4 刷新战绩 329 10.4.5 刷新房间列表 329 10.4.6 加入房间 330 10.4.7 创建房间 331 10.4.8 刷新按钮 332 10.5 房间面板逻辑 332 10.5.1 面板类 332 10.5.2 获取部件 333 10.5.3 网络监听 334 10.5.4 刷新玩家列表 334 10.5.5 退出房间 336 10.5.6 开始战斗 336 10.6 打开列表面板 337 10.7 服务端玩家数据 337 10.7.1 存储数据 338 10.7.2 临时数据 338 10.8 服务端房间类 339 10.8.1 管理器和房间类的关系 339 10.8.2 房间类的设计要点 340 10.8.3 添加玩家 341 10.8.4 选择阵营 343 10.8.5 删除玩家 343 10.8.6 选择新房主 345 10.8.7 广播消息 345 10.8.8 生成房间信息 345 10.9 服务端房间管理器 347 10.9.1 数据结构 347 10.9.2 获取房间 347 10.9.3 添加房间 348 10.9.4 删除房间 348 10.9.5 生成列表信息 348 10.10 服务端消息处理 349 10.10.1 查询战绩MsgGet-Achieve 350 10.10.2 查询房间列表MsgGetRoom-List 350 10.10.3 创建房间MsgCreate-Room 351 10.10.4 进入房间MsgEnterRoom 351 10.10.5 查询房间信息MsgGet-RoomInfo 352 10.10.6 离开房间MsgLeave-Room 352 10.11 玩家事件处理 353 10.12 测试 354 第11章 战斗和胜负判定 358 11.1 协议设计 358 11.1.1 进入战斗MsgEnterBattle 359 11.1.2 战斗结果MsgBattleResult 359 11.1.3 退出战斗MsgLeaveBattle 360 11.2 坦克 360 11.2.1 不同阵营的坦克预设 360 11.2.2 战斗模块 361 11.2.3 同步坦克SyncTank 362 11.2.4 坦克的属性 362 11.3 战斗管理器 363 11.3.1 设计要点 363 11.3.2 管理器类 363 11.3.3 坦克管理 364 11.3.4 重置战场 365 11.3.5 开始战斗 366 11.3.6 产生坦克 367 11.3.7 战斗结束 369 11.3.8 玩家离开 369 11.4 战斗结果面板 369 11.4.1 面板预设 369 11.4.2 面板逻辑 371 11.5 服务端开启战斗 373 11.5.1 能否开始战斗 373 11.5.2 定义出生点 373 11.5.3 坦克信息 376 11.5.4 开启战斗 377 11.5.5 消息处理 377 11.6 服务端胜负判断 378 11.6.1 是否死亡 379 11.6.2 胜负决断函数 379 11.6.3 定时器 380 11.6.4 Room::Update 380 11.7 服务端断线处理 381 11.8 测试 382 11.8.1 进入战场 382 11.8.2 离开战场 384 第12章 同步战斗信息 386 12.1 同步理论 387 12.1.1 同步的过程 387 12.1.2 同步的难题 387 12.2 状态同步 389 12.2.1 直接状态同步 389 12.2.2 跟随算法 390 12.2.3 预测算法 390 12.3 帧同步 391 12.3.1 指令同步 391 12.3.2 从Update说起 392 12.3.3 什么是同步帧 393 12.3.4 指令 394 12.3.5 指令的执行 394 12.4 协议设计 395 12.4.1 位置同步MsgSyncTank 396 12.4.2 开火MsgFire 396 12.4.3 击中MsgHit 397 12.5 发送同步信息 397 12.5.1 发送位置信息 397 12.5.2 发送开火信息 398 12.5.3 发送击中信息 399 12.6 处理同步信息 400 12.6.1 协议监听 400 12.6.2 OnMsgSyncTank 401 12.6.3 OnMsgFire 401 12.6.4 OnMsgHit 402 12.7 同步坦克SyncTank 402 12.7.1 预测算法的成员变量 402 12.7.2 移动到预测位置 403 12.7.3 初始化 404 12.7.4 更新预测位置 405 12.7.5 炮弹同步 406 12.8 服务端消息处理 406 12.8.1 位置同步MsgSyncTank 407 12.8.2 开火MsgFire 408 12.8.3 击中MsgHit 409 12.8.4 调试 410 12.9 完善细节 412 12.9.1 滚动的轮子和履带 412 12.9.2 灵活操作 413 12.9.3 准心 413 12.9.4 自动瞄准 414 12.9.5 界面和场景优化 414 12.9.6 战斗面板 415 12.9.7 击杀提示 416 12.10 结语 416 |