# Tanks_Client_StepLock **Repository Path**: jacob_ddl/Tanks_Client_StepLock ## Basic Information - **Project Name**: Tanks_Client_StepLock - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-07-16 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TanksOnline ![](https://unity3d.com/sites/default/files/projectbanner.jpg) U3d坦克教程网络化 U3d双人坦克教程实现了一个单机双人对战游戏。 * 原地址 http://unity3d.com/cn/learn/tutorials/projects/tanks-tutorial * 链接:http://pan.baidu.com/s/1jHpCxCU 密码:5u46 本教程添加网络功能,让双人坦克支持网络对战。实现步骤记录下来。同时使用巨人Lua手游服务器开发服务器功能。 ## 步骤 1. 创建U3d工程 1. 导入 Tanks Tutorial v1.3a (Dec 08, 2015).unitypackage 1. 设计协议 + 协议因为是C/S公共的,定义于 Common 项目 proto/tanks + 协议用 proto buffer 定义,分成多个 service. + tanks.proto, 服务器提供服务 - 战斗配对 - 移动,转向,开火 + tanks_push.proto,客户端提供服务 - 进入房间开始战斗 - 转发对手动向 - 伤害值广播 + msg.proto,公共消息定义 1. 添加网络模块 1. 复制 ServiceCenter.Editor.dll 到 Assets\Editor\ 1. 菜单 GameBox->ServiceCenterEditor->Create - Giant Light Server (巨人轻量服务器) - 点 Update, 会自动选择依赖库并下载到 Asset/GameBox/ 1. GameBox Unity 配置 - 创建一个GameObject, 命名为 GameBox - 将ServicePlayer添加到该GameObject - 启动页面不需要,将颜色的alpha置为0。 - 将所需服务对应的Installer添加到该GameObject上 - 添加 Giant Light Server Installer - 会自动添加 Byte Storage Installer - 会自动添加 Network Manager Installer 1. GameBox 初始化 - 创建 GameRpc 用来初始化GameBox, 添加 Rpc/Controller.cs - 创建 Client,实现 IGiantLightClient - GameManager中添加对 GameRpcController 的引用 - GameManager 在开始游戏前等待 Rpc 初始化完成 1. 实现一条协议:登录 - 游戏开始前登录 - 用 ProtoToCS.bat 生成代码到 Scripts/ProtoBuf/ 1. GameRpcController 添加接口更方便 Rpc 调用 1. 对网络模块进行了调整 - 由于加入了一个开始界面(BeginScene)和加载界面(LoadingScene),所以可以把网络模块移到开始界面 - 在开始界面创建RpcController空白组件 - 按照上面第3点GameBox Unity 配置的步骤操作RpcController组件 - 修改Rpc.Controller类中IGiantLightServer的对象为静态变量,以实现不同场景都可以调用该控制器的方法 - 在开始界面,Controller类的Start()方法实现与服务端的连接 - 开始界面的按钮实现玩家用户名的设置 - 在加载界面,创建一个Manager空白组件, 并绑定connection脚本 - connection脚本调用Rpc.Controller类的SendRequest()方法以实现登录和创建房间功能 1. 战斗配对 1. 客户端向服务端发送匹配请求,匹配逻辑由服务端完成 2. 完成匹配后,服务端向客户端推送进入房间请求 3. 客户端处理服务端推送过来的加入房间的请求,进入战斗场景 1. 移动和转向 1. 禁止对方坦克受键盘控制 1. 发送移动消息 1. 收对方的移动消息,设置到对方坦克 1. 发送旋转信息 1. 接受对方的旋转信息,设置到对方坦克 1. 消息发送的优化,只在实际产生位移或旋转的情况下才向服务端发送消息 1. 开火和伤害 1. 禁止对方坦克受键盘控制开火 1. 发送开火消息 1. 接受对方的开火消息,对方坦克根据位置、角度、力度开火 1. 炮弹爆炸时向服务端发送爆炸点的坐标 1. 服务端根据爆炸点的坐标和玩家间的距离分别计算出对两玩家的伤害 1. 服务端向两个玩家推送对两者的伤害 1. 客户端接受伤害数据,处理伤害数据 1. 存在的BUG 1. 服务端有时会产生“Can not find mail box to request”的RPC警告,应该是上下文这个变量为空了,不知原因何在?是客户端请求过快或者请求存在冲突引起的? - BUG的原因已经发现,是在对战的过程中,其中某一个客户端断线又重连引起的,重连后客户端的rpc_clt_id发生了变化。 1. 待优化部分 1. 客户端同步时的卡顿,考虑用补间动画来改进