Unity外包团队:关于手机unity游戏开发的技术选型
技术选型
Unity引擎内置了多人联机的解决方案,涵盖了从最底层的网络数据传输,到不同玩家之间的消息发送,再到游戏大厅这样的高级功能。考虑到Unity官方提供的云服务(Internet Services)在国内的延迟较高,而且需要付费,我们决定采用Steam与Unity相结合的方式。底层用Steam发送网络数据包,中间由Unity负责把各个包整合成游戏逻辑所需要的格式,高层的大厅也使用Steam提供的服务。
说到这里要赞美一下Unity Networking的模块设计,它把具体的网络数据传输细节和抽象的消息发送功能分离开来。使得开发者既可以使用传统的“IP地址+端口”的方式实现玩家之间的连接,也可以相对方便地接入Steam或WeGame,利用这些平台SDK包含的更高级的功能去收发网络数据。而且Unity的网络模块是开源的,不仅方便查阅,还可以根据自身需求进行修改,然后替换掉引擎自带的模块。

服务器
联网游戏需要一个服务器,用于协调多个玩家之间的游戏进程。否则大家的电脑有快有慢,很容易出现游戏节奏不一致的情况。比如,玩家A的电脑配置高,运行流畅;玩家B的电脑有点卡,会掉帧。那么,当游戏需要3个小飞碟从上方飞入屏幕攻击玩家的时候,可能玩家A那边的飞碟已经全部就位,开始发射子弹了;但玩家B那边刚刚创建出第二个飞碟。这样就导致不同玩家屏幕上显示的内容完全不同,很难进行正常的游戏。引入服务器就是要避免出现各种各样的不一致行为,让速度快的机器等等速度慢的,大家尽可能保持相同的步调去执行游戏逻辑。
这个服务器可以是独立的后台,就像一个网站那样托管在某个云计算厂商那里;也可以让某个玩家来充当服务器,在运行自己游戏逻辑的同时也负责调度其他玩家的游戏。不过,开发并维护一个独立服务器的成本相对而言还是挺高的,所以我们选择了第二种方案,就让创建房间的玩家来兼职做服务器。Unity恰好有一个Host模式,支持一个玩家同时扮演服务器和客户端。
- 创建房间:玩家A向Steam发起申请,并设置最大人数为2。如果成功,A就成为房间的所有者,进入角色选择界面。同时,A还需要启动服务器(NetworkServer),等待其他玩家的进入。
- 查询房间:玩家B设置筛选条件去查询当前列表,Steam会返回还有空余位置的房间。如果A创建的房间符合条件,该房间就会包含在返回结果之中。
- 进入房间:B申请进入A创建的房间。如果成功,A和B之间就可以通过Steam互相发送消息。但这时房间内的玩家只能进行基本的通信,还不能利用Unity提供的状态同步等机制。
- 建立C/S关系:B向A发送连接请求(NetworkClient),A收到后建立连接。这样,后续的游戏同步逻辑就可以按照Unity的方式进行。
- 开始游戏:B进入房间,选择自己的角色。完毕后,A通知双方加载游戏场景。
以下是场景中需要注意的事项:
- 时间:许多场景的移动、关键动作的触发都跟时间相关,所以当前游戏进行的时间是场景保持同步的关键。
- 杂兵行为:我们游戏中有一百多个杂兵,基于这些杂兵有八百多个不同的行为。这些行为都是用PlayMaker编辑的状态机。要让如此众多的状态机去支持联网,手动去挨个修改是不可能的,只能利用脚本批量修改。
- 状态机:我们设计关卡时,会根据游戏进行的时间或者地图移动的位置去指定某个杂兵的行为。这些行为一般遵循先创建杂兵单位,再移动射击,最后被击落或离开屏幕的规律。这里边包含两部分,一是用于交互和同步的杂兵,二是控制杂兵行为的状态机。在单机情况下,状态机创建出单位紧接着执行后续操作;在联网模式下为了状态同步,场景中物体的创建和销毁需要在服务器端进行。所以,原有的状态机在服务器和客户端上的执行不再一致。服务器创建的杂兵单位,会通过Unity的机制自动在客户端上克隆出来,这样客户端不再需要自己创建,而是等待单位被服务器创建出来后作为参数传入状态机里去执行后续动作。
- Boss行为:一般的杂兵行为比较简单,在屏幕中存在的时间也较短,在服务器和客户端上各自运行也不会产生太大差别。但Boss的行为比较复杂,运行一段时间后就会出现明显偏差。我们在状态机内部的关键节点上加入等待机制,让各玩家在运行到节点处同步进入下一状态。

- 有Unity3D项目外包欢迎联系我们
- QQ 372900288
- TEL 13911652504
- WX Liuxiang0884
Unity外包团队:关于手机unity游戏开发的技术选型的更多相关文章
- Delphi Xe4 游戏开发的技术选型.
asphyre 是支持 FireMonkey的. 利用Firemonkey的跨平台接口.实现 win,mac,ios. 其它方案估计就得靠 FPC 了. 好处是多了输出Andriod的可能. zeng ...
- 手机3D游戏开发:自定义Joystick的相关设置和脚本源码
Joystick在手游开发中非常常见,也就是在手机屏幕上的虚拟操纵杆,但是Unity3D自带的Joystick贴图比较原始,所以经常有使用自定义贴图的需求. 下面就来演示一下如何实现自定义JoySti ...
- Unity外包团队:U3D与UE我选哪个好?请别再问这种问题了!
原本预先决定的两家VR游戏公司采访,思熊和星为棋,并没有发现什么共性之初.结果在采访之后却意外发现,两家的经历有着非常相似的地方.他们都是来自于开发游戏所用的引擎的原开发商,比如思熊的主力来自Epic ...
- Unity3D手机斗地主游戏开发实战(04)_出牌判断大小(已完结)
之前我们实现了叫地主.玩家和电脑自动出牌主要功能,但是还有个问题,出牌的时候,没有有效性检查和比较牌力大小.比如说,出牌3,4,5,目前是可以出牌的,然后下家可以出任何牌如3,6,9. 问题1:出牌检 ...
- Unity3D手机斗地主游戏开发实战(04)_出牌判断大小
之前我们实现了叫地主.玩家和电脑自动出牌主要功能,但是还有个问题,出牌的时候,没有有效性检查和比较牌力大小.比如说,出牌3,4,5,目前是可以出牌的,然后下家可以出任何牌如3,6,9. 问题1:出牌检 ...
- Unity外包团队:Daydream控制器只提供了3个自由度
HTC Vive,Oculus Rift以及微软即将推出的MR头显都拥有6自由度的运动控制器,这意味着你在虚拟世界中可以任意摆动你的手.然而,Daydream控制器只提供了3个自由度,这对于手部运动具 ...
- Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现(不定期更新中~~~)
目录 Unity3D手机斗地主游戏开发实战(01)_发牌功能实现 Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现 一.大体思路 前面我们实现了点击开始游戏按钮,系统依次给玩家发牌的逻辑和 ...
- Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现
大体思路 前面我们实现了点击开始游戏按钮,系统依次给玩家发牌的逻辑和动画,并展示当前的手牌.这期我们继续实现接下来的功能--叫地主. 1.首先这两天,学习了DOTween,这是一个强大的Unity动画 ...
- 【转】 [Unity3D]手机3D游戏开发:场景切换与数据存储(PlayerPrefs 类的介绍与使用)
http://blog.csdn.net/pleasecallmewhy/article/details/8543181 在Unity中的数据存储和iOS中字典的存储基本相同,是通过关键字实现数据存储 ...
随机推荐
- 内网gitlab11.2升级至11.4.5
当前gitlab版本 宿主机是一台ubuntu 运行备份命令 sudo gitlab-rake gitlab:backup:create STRATEGY=copy 升级命令 sudo apt-get ...
- 交叉编译7zip过程
https://github.com/Distrotech/p7zip.git 从这里下载,不要从sourceforge.net上下载,那上面的缺makefile文件. 我主要把文件 makefile ...
- cocos creator 无法打开项目 dock栏只显示图标问题解决方法
1.打开项目 2.找到 library和local文件夹 3.清空这两个文件夹的数据 4.问题已解决 原因: 以前生成的旧数据会和新数据发生冲突,把生成的旧数据清理掉就OK了.
- Docker入门详解(转载)
来源 http://dockone.io http://dockone.io/article/6051 Docker是世界领先的软件容器平台,所以想要搞懂Docker的概念我们必须先从容器开始说起. ...
- php----------linux下安装php的swoole扩展
1.首先你已经安装好了php环境,这里就不介绍php环境的安装了.如果你是编译安装记得将php加入环境变量,以便于方便查看扩展是否安装成功. 2.我安装的php环境缺少了要给东西,详细看下图 如果你没 ...
- Linux设置定时任务
什么是crond? crond是Linux系统用来定期执行命令或指定程序的服务的一种服务或软件.一般情况下当我们安装完成Linux操作系统之后,默认便会启动Crond任务调用服务.Crond服务会定 ...
- sedlauncher.exe
这个进程很恐怖,屁大点的东西,但会造成磁盘爆满. 首先,这个99%不是病毒,而是win10更新后出现的东西. 关于解释,国内乱七八糟的,我没有搜到,只好在狗哥和微软官网搜了一下. 大多说是 KB402 ...
- jquery autocomplete 设置滚动条
加入样式 .ui-autocomplete{height:250px; overflow-y: scroll; overflow-x: hidden;}
- Windows system 在python文件操作时的路径表示方法
file_path =(r'i:\vacpy\ch10\pi_digits.txt') #将文件路径存储在变量file_path中with open (file_path) as file_objec ...
- Spring boot 源码分析(前言)
开坑达人 & 断更达人的我又回来了 翻译的坑还没填完,这次再开个新坑= = 嗯,spring boot的源码分析 本坑不打算教你怎么用spring boot = = 也不打算跟你讲这玩意多方便 ...