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中字典的存储基本相同,是通过关键字实现数据存储 ...
随机推荐
- 学习记录----简单的原生js路由
在以前的web程序中,路由字眼只出现在后台中.但是随着SPA单页面程序的发展,便出现了前端路由一说.单页面顾名思义就是一个网站只有一个html页面,但是点击不同的导航显示不同的内容,对应的url也会发 ...
- Random-Forest-Python
1. 近期目标,实现随机森林进行点云分类 1)学习阶段: [干货]Kaggle 数据挖掘比赛经验分享 Kaggle Machine Learning Competition: Predicting T ...
- TypeError: Fetch argument 0.484375 has invalid type <class 'numpy.float32'>, must be a string or Tensor. (Can not convert a float32 into a Tensor or Operation.)
报错: TypeError: Fetch argument 0.484375 has invalid type <class 'numpy.float32'>, must be a str ...
- Python3.0科学计算学习之绘图(三)
matplotlib对象: 使用matplotlib的pyplot模块,可以供用户直接使用最重要的绘图命令.多数情况下,我们希望创建一个图形并且立即展示出来,但是有时如果生成要通过更改其属性来修改的图 ...
- MySQL学习——标识符语法和命名规则
转自:http://blog.csdn.net/notbaron/article/details/50868485 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron ...
- static 关键字的作用
在C语言中,关键字static有三个明显的作用: 1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区). 2) 在模块内(但在函数体外),一个被声明为静态 ...
- 轻量级集群管理软件-Ansible
ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppet,但是有一个不同 ...
- P1186 玛丽卡
题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...
- maven 安装m2e 报错
Eclipse安装maven插件m2e m2e - http://m2eclipse.sonatype.org/sites/m2e m2e-extras - http://m2eclipse.sona ...
- python & mysql 操作(compare_sum_fee)
[1]源码 工作中涉及的python工具源码实现 费用比较工具源码: #!/usr/bin/python3 #coding = utf-8 import time, sqlite3, datetime ...