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中字典的存储基本相同,是通过关键字实现数据存储 ...
随机推荐
- 2018-2019-2 网络对抗技术 20165236 Exp2 后门原理与实践
2018-2019-2 网络对抗技术 20165236 Exp2 后门原理与实践 一.实验内容 (3.5分) (1)使用netcat获取主机操作Shell,cron启动 (0.5分) (2)使用soc ...
- postman headers 请求参数和MD5加密签名
postman 变量可以这样写:{{timestamp}} ,也可以用系统的,{{$timestamp}},这样就不用给自己赋值了,但在 pre-requestScript中是获取不到这个值的 所以我 ...
- C#的抽象类和接口,区别与相似
一.抽象类:抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们 ...
- Django的admin管理系统写入中文出错的解决方法/1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ‘locate’
Django的admin管理系统写入中文出错的解决方法 解决错误: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and ( ...
- matlab的Deep Learning的toolbox 中的SAE算法
最近一直在看Deep Learning,各类博客.论文看得不少 但是说实话,这样做有些疏于实现,一来呢自己的电脑也不是很好,二来呢我目前也没能力自己去写一个toolbox 只是跟着Andrew Ng的 ...
- datatable的select()结果直接修改,会体现在表上
如果你只是要修改DataTable里的DataRow的话没有必要找到它的行号,直接在Select后得到的DataRow上修改就行了,它的修改会直接反映到DataTable上(其实就是直接修改了Data ...
- 安装percona-toolkit工具时遇到的问题
1. 从这个链接https://www.percona.com/doc/percona-toolkit/3.0/index.html下载percona-toolkit安装包 2. 下载完成通过ftp工 ...
- Android Studio环境安装
Android Studio下载 http://www.android-studio.org/ JDK下载 https://www.oracle.com/technetwork/java/index. ...
- JS控制语句(if、for等)、数组(例题)、方法(常用方法介绍)
控制语句 If if (1>2){ alert() } var a= parseInt(prompt('请输入数字')); if (isNaN(a)) { alert("输入的不是数字 ...
- Linux学习笔记之Linux添加/删除用户和用户组
本文总结了Linux添加或者删除用户和用户组时常用的一些命令和参数. 1.建用户: adduser phpq //新建phpq用户 passwd phpq //给phpq用户设置密码 2.建工作组 g ...