如何评价unity3d unet5中多人游戏和网络模块UNet

Unity5.1 新的网络引擎UNET(一) 概括2 - 博客频道 - CSDN.NET
游戏开发实验室_孙广东
做什么事,喜欢最重要!
分类:unity3d
Editor私人定制
有两种网络功能的用户:o 用户使用Unity 制作多人游戏。这些用户应该开始使用NetworkManager 或者 High Level API.o 用户建设网络基础设施 或 高级的多人游戏。这些用户应该开始使用 NetworkTransport API。High level scripting API& 高层次的脚本 APIUnity 的网络有一个“high-level” 的脚本 API (它我们将称为 HLAPI)。使用这种方法可以访问命令 涵盖最常见的要求,用户游戏而无需担心的“lower level” 的执行细节。HLAPI,您可以:o 使用& “Network Manager”.控制游戏的网络状态。o 主机是一个 player 客户端。运营 “Network Manager”.游戏o 使用通用的序列化程序的数据进行序列化。o 发送和接收messages邮件。o 将网络的命令从客户端发送到服务器。o 远程过程调用 (Rpc) 从服务器向客户端。o 将网络的事件从服务器发送到客户端。Engine and Editor 集成Unity 的网络集成到engine&和&editor,允许您使用 组件和 visual aids,建立您的多人游戏。它提供了:o 网络对象 的 NetworkIdentity 组件。o NetworkBehaviour 网络的脚本。o 可配置 自动同步 对象的变换。o 自动同步的脚本变量。o 支持网络的对象置于Unity的场景。o Network组件Internet ServicesUnity 提供互联网服务,以 支持你的游戏,在整个生产和发行,其中包括:o Matchmaking serviceo Create matches and advertise matches.o List available matches and join matches.o Relay servero Game-play over internet with no dedicated server.o Routing of messages for participants of matches.NetworkTransport 实时传输层Unity 包括提供实时传输层:o 优化基于 UDP 协议。o Multi-channel design to avoid head-of-line blocking issues 多通道设计,以避免头的线阻塞问题o 每个通道支持各种levels 的服务质量 (QoS) 。o 灵活的网络拓扑结构,支持对等 或 客户机-服务器体系结构。High Level API高级别 API (HLAPI) 是一个系统& Unity游戏的建设多人游戏功能。它建立在 较低级别的传输实时通信层, 且处理多人游戏的许多常见任务。而传输层支持任何形式的网络拓扑结构,HLAPI 是一个服务器的权威系统;& 虽然它允许在同一时间& 是客户端和服务器的参加者之一,& 所以没有专用的服务器进程& 。这工作结合了 互联网服务,允许将发挥在互联网上与& 小工作从开发人员的多人游戏。HLAPI 是Unity一套新的网络命令集成,在新的命名空间中 ;UnityEngine.Networking 它集中 在易用性和 迭代开发,如为多人游戏,提供有用的服务:o 消息处理程序o 通用高性能序列化o 分布式对象管理o 状态同步o Network classes: Server, Client, Connection, etcHLAPI 是由一系列层添加功能:
排名:第1515名
友情链接-我的世界
爱科技、爱游戏、有梦想、一起!
(18)(32)(129)(10)(1)(8)(11)(3)(15)(4)(1)(6)(7)(4)(6)(5)(4)(3)(2)(0)(5)(5)(2)(9)(2)(2)
我的微博 欢迎关注
当前系统时间如何评价Unity5中多人游戏和网络模块UNet?
在Unity5中出现的新的网络模块UnityEngine.NetworkingIntro Video:
按投票排序
目前来看,对于中国国情有点蛋疼。Unity之前版本有Master Server,用于提供在互联网平台上的匹配房间创建和查找,并且可以Net穿透数据。但是UNet抛弃了原有的Master Server,使用类似于阿里云的Unity Cloud按使用量付费的形式作为互联网的联机的平台,而且到目前5.3.1版本为止还没有可以单独部署服务器的版本。鉴于中国到Unity的网速,要么你只能使用Unet做成局域网版本,要么只能发布国外了。补充下答案目前Unet这个功能在Unity应该会分为3个阶段开发1. 完成点对点数据同步,基于UDP的P2P可靠与不可靠网络。2. 提供服务器版本库,可以自行开发独立于Unity的服务器版本(非Headless模式)3. 提供分区架构负载均衡版本的服务器目前版本截至5.3位置相当于 阶段1中仅仅提供点对点的同步功能,还缺少主机切换,验证服功能等,基于互联网匹配同步的版本需要使用Unity Cload完成。阶段2的时候就应该可以自行通过Unet库开发服务器管理,机器人AI,等一些脱离Unity的本地版本阶段3的时候就是一个能适应MMO项目的服务器目前阶段2大概要Unity6公布至于阶段3遥遥无期中Roadmap可以见:找Net那部分就是了
Networking是一种软件研发在跨平台路上更近一步的体现,真正做到了:anytime,anywhere,one code for all platform!Networking出现之前,Unity仍然是一个客户端游戏开发引擎。Networking出现之后,Unity甚至成为了跨客户端服务端的游戏开发引擎。同样的组件在Unreal中早有产生,但追溯到最早的话,那可能就是国外各大游戏公司的私有引擎了。但Unity的威力在于其广泛的普及程度,所以它是首次将该组件推广至光罗大众的商业引擎。Networking本质上是对传统C-S架构软件下的网络层的高度抽象。服务器逻辑和客户端逻辑在一个类里面编写(这里会带来一些代码整洁度上的麻烦~~)服务器和客户端要做数据同步,不用发包了,在属性前面加上[SyncVar]标签就自动同步了。客户端调用服务器,不用发包了,函数调用即可。服务器调用客户端,不用发包了,函数调用即可。带来的好处太多都不用说了。带来的坏处,安全性上堪忧,设想一下,如果客户端和服务器逻辑都在一起,一旦客户端被反编译了,那么是不是服务器逻辑都泄漏了。带来的坏处2,服务器程序员可能不需要写游戏逻辑了。。
2016年4月更新:UNet适合搞demo,但目前不建议使用UNet作为正式关键游戏服务器。原罪并不归于UNet,而是归于Unity Engine/Unity Headless Mode,有比较大的不可控消耗,并不能做到足够的Modulation。和Unity Engine的人面对面就UNet询问过,其原话回答包括:- “modulation is way too difficult”(就是说,server版本的Unity,目前肯定消耗很大)- “Should not run unity on the server”。另,就Unity的Roadmap看来,UNet的更新变得相对变少,个人有种“项目瓶颈”甚至是“项目停更”的感觉。最关键规避Unity在服务器消耗问题的UNet更新“Networking: Server Library”,其本该随Unity5.4发布的,但现在被严重delay到Roadmap中的Alpha Version中。--------------------以下为原回答--------------------现在的评价应该都还不是经过大量用户大型产品验证过的评价。至少半年后才能给得出真实客观的评价。1、对比传统server高权威要求的c/s方式(server照跑AI物理寻路等几乎一切逻辑),uNet带来好处是开发效率提高(unity丰富的引擎工具功能和统一cs代码),坏处是带来mono额外消耗、引擎额外消耗、代码风险全集中在“unity开发同学”身上。2、对比传统server低权威要求的c/s方式(client上报物理寻路位置命中、server仅处理数值血量状态技能可否使用等关键逻辑、事后校验),uNet可以让你较方便改成高权威server提高安全性,带来坏处是server负载变高许多、增大带宽消耗、代码风险全集中在“unity开发同学”身上。3、对比传统帧同步(lockstep)或bucket同步方式,uNet可以让你改为高权威server提高安全性,减少蝴蝶效应带来的不同步,不需重写determinstic的数学库物理库、不需实现落后者加速重播机制。但放弃了帧同步的简单性,和带来上面1、2点提到过的坏处。(由于手游盛行,手机作弊难度*目前*较大,现会有手游项目采用类帧同步方式)整体来看,uNet是未来的方向。坑要躺,一起躺。
网络模块目测用处不是特别的大,一般通信都是单独写的,需要看公司后台用什么技术和协议。
目前使用UNET开发了两款局域网对战的小游戏。对于初中级程序员(自己写Socket通讯困难)来说使用起来还是挺方便的。好处是客户端和服务器使用同一套代码,当然也可以写一个专用服务器。Youtobe上有人做了简单的教程,下载了下来,分享到了百度云。大厅部分参考了AssetStore中官方的Demo 。基本上参考这两个做出来一个简单的例子不成问题。还有就是UNET是开源的,对于中高级用户来说可以哪里不爽改哪里
谢邀。目前手头项目fps类手游正在试用。相比旧版,感觉非常好,值得一试。双端同工程。在这一点上,通讯同步确实做得非常方便,甚至不需要关心底层数据交互。目前初步担心是io量略大,待进一步了解再做实评。
谢邀 不过已经被公司抓取做UE4了 真心没接触过Unity5的network UE4相比Unity4在网络上还是好很多的 从Actor层(相当于Unity中的GameObject)就设置了网络同步的功能
还未了解过Unet,关于是否使用unity提供的network模块,要看公司关于服务器技术的选型。
我们项目也是用unity做战斗服务器,不过用的不是UNET,而是自己写的Socket,并发问题不大,这些都用机器人测试过。我现在唯一担心的是mono的带来的GC消耗和unity底层的稳定性。期待IL2CPP技术带来的性能提升。
我已经开始用了,不过我是个独立开发者而已。用起来真的比network view顺心很多。很多事情都不用管了,要同步的变量直接加个SyncVar,丢给unity就好。但是现在教程太少,我能找到稍微齐全一点的教程就是Youtube上的那俩。不知道为什么,过了这么久,国内几乎还没有出现Unet的教程。
已有帐号?
无法登录?
社交帐号登录Unity5.1 新的网络引擎UNET(三) UNET NetworkManager - 博客频道 - CSDN.NET
游戏开发实验室_孙广东
做什么事,喜欢最重要!
分类:unity3d
Editor私人定制
我们先来看看这第一个大类的 定义:直接继承自& ,& 还有就是被设计成了单例& singleton NetworkManager 网络管理器是一个方便的HLAPI 类,用于管理网络系统 。&&&&&&& 对于简单的网络应用NetworkManager 网络管理器可以使用HLAPI控制 。它提供了简单的方法来& 启动和停止& 客户端和服务器,以及 管理场景,而且具有虚拟函数,用户代码可以使用 实现 网络事件的处理程序。NetworkManager 网络管理器一次处理一个客户端。下面的示例演示一个最小的网络设置。using UnityEngine.N
public class Manager : NetworkManager {
public override void OnServerConnect(NetworkConnection conn)
Debug.Log (&OnPlayerConnected&);
}NetworkManager 网络管理器是 管理网络状态的多人游戏的一个组成部分。它实际上被实现完全使用 HLAPI,所以它做的一切都是可被其他forms的开发人员使用的。然而网络管理器包装了很多有用的功能,使得创建、 运行和调试尽可能简单的多人游戏。网络管理器可以使用完全不用脚本。它有在编辑器中有 inspector 控件,允许配置其所有功能,和 NetworkManagerHUD 提供简单、默认的用户界面,可以在运行时允许被用户控制的网络游戏。为高级的使用,开发人员可以从网络管理器派生出类 并通过重写虚函数,为它提供的任何自定义其行为。网络管理器的功能包括:o Game State Managemento Spawning Managemento Scene Managemento Debugging Informationo Matchmaking 匹配系统o Customization 可定制入门 NetworkManager网络管理器可以作为控制组件的多人游戏的核心。若要开始,在你开始的场景,创建一个空的游戏对象或挑选一个方便管理器对象。从Network/NetworkManager菜单项,然后添加NetworkManager组件。新添加的NetworkManager应如所示:在编辑器中的NetworkManager的的inspector 面板上 允许您配置和控制与网络相关的很多东西。NetworkManagerHUD 是与NetworkManager相关的的另一个组件。游戏运行控制网络状态时,它给你一个简单的用户界面。这是很好的入门知识网络项目,但不能用作游戏最终的 ui 设计。NetworkManagerHUD 看起来像: &真正的游戏会有正确的UI ,用于控制游戏状态 和 允许玩家选择什么样的游戏 。但是,若要开始,我们可以暂时以此来控制游戏。Game State Management作为客户端,作为一个专用的服务器,或作为 “Host” 是客户端和服务器在同一时间具备 ,UNet 多人游戏可以在三种模式下-运行。UNet 旨在使相同的游戏 代码和资产 在所有这些情况下工作。发展为& 单人游戏版本游戏和& 多人游戏版本游戏& 应该是同一件事。网络管理器& 具有用于输入每一种模式的方法。NetworkManager.StartClient()、 NetworkManager.StartServer() 和 NetworkManager.StartHost()& 是所有可用的脚本代码,所以它们可以被调用,从键盘输入的处理程序或自定义UI 事件 。可以选择要显示的默认运行时控件也调用这些相同的功能。也有按钮在 NetworkManagerHUD 的 inspector上,在Play 模式时调用同一函数:无论哪种方法用来 改变游戏状态、 networkAddress网络地址和&networkPort网络端口 属性被 使用。当启动时后的服务器 或主机 时,networkPort 成为& 侦听端口。当客户端启动时,networkAddress是要连接到的地址、networkPort 是要连接到的端口。Spawning Management网络管理器可以用于管理网络对象从预置的实例化 。大多数游戏都有 prefab 用作player 的对象,因此网络管理器有一个 槽(字段),拖动player prefab进行赋值。当一个player prefab 设置时,player 对象会自动产生从该prefab, 为每个用户在游戏中创建。这适用于在本地player托管hosted服务器上,和远程客户端上的远程players 参与者。请注意player prefab 必须有 NetworkIdentity 组件。除了player prefab,其他对象的预置将动态地被生成了但是必须是ClientScene登 记的。这可以通过使用 ClientScene.RegisterPrefab() 函数,或者它可以由网络管理器自动完成。添加 预置生成列表 会使他们自动注册。NetworkManager的 inspector 的字段 配置看起来像:一旦设置了一个player prefab ,你应该能够作为主机开始游戏,看到 player 对象产生。停止这场比赛应该使player 对象被销毁。当要运行另一个副本的游戏和 连接到本地主机的客户端应使另一个player 对象出现,并停止该客户端应该使该客户端player 对象被销毁。&player object 被被生成是由& NetworkManager.OnServerAddPlayer 默认实现。 如果你想自定义&player object 的创建的方式,你可以重写的虚函数。默认实现是类似:public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
}请注意,新创建player object.时NetworkServer.AddPlayerForConnection() 必须被调用函数,所以它是被生成和与客户端的连接相关联。这将产生的对象,所以 NetworkServer.Spawn 不需要为 player object.Start Positions若要控制players 被创建,在这里,你可以使用 NetworkStartPosition 组件。网络管理器查找场景中的 NetworkStartPosition 对象,如果它找到了,然后它将产生Player的位置和方向 。自定义代码可以通过NetworkManager.startPositions列表 ,访问可用的 NetworkStartPositions,也是一个 helper 函数 GetStartPosition() 对网络管理器,可以在执行 OnServerAddPlayer 用于查找起始位置。Scene Management大多数游戏都有多个场景。在至少有通常是标题屏幕 或 开始菜单场景 还有玩这个游戏的场景。网络管理器是设置来自动管理场景状态 和 场景切换 适合多人游戏的方式。网络管理器的属性面板 有两个插槽: offlineScene 和 onlineScene。将 场景对象拖放到这些插槽 激活网络场景管理。服务器或主机启动时,将加载online在线的场景。这将会成为当前的网络场景。连接到该服务器的任何客户端将奉命加载这个场景。这个场景的名称存储在 networkSceneName 属性中。当网络停止时,通过停止的服务器或主机,或断开连接,客户端将加载offline脱机的场景。断开多人游戏时游戏允许自动返回到菜单场景 。通过调用 NetworkManager.ServerChangeScene(),游戏处于活动状态时,还可以更改场景。这将使所有当前连接的客户端更改场景,并将更新 networkSceneName,新客户还将加载新的场景。虽然网络的场景管理处于活动状态,调用任何游戏状态管理功能 NetworkManager.StartHost() 或 NetworkManager.StopClient() 可导致场景变化。这适用于运行时控制 UI。所以通过设置场景 并调用这些函数很容易控制流的多人游戏。注意,场景变化导致的所有对象在场景将被销毁。这可能包括网络管理器!& 如果你想要网络管理器在转换是不被销毁,那就确保 “Dont Destroy On Load” 属性被设置为 true。在简单的情况下,这是最佳配置。但是,它是可能有网络管理器在每个使用不同的设置,以控制增量的预制加载或不同的场景切换的场景。Debugging InformationNetworkManagerHUD 属性面板在运行时显示有关网络状态的其他信息。这包括:o 网络连接o&激活 NetworkIdentity 服务器对象o&激活 NetworkIdentity 客户端对象o client peers另外,预览 窗口中显示所注册的客户端消息处理程序。Matchmaking匹配系统网络管理器在运行时 用户界面和网络管理 inspector& UI 允许与匹配服务的交互。NetworkManager.StartMatchmaker() 函数作为匹配接口,并填充具有一个 NetworkMatch 对象的 NetworkManager.matchmaker 属性。一旦这是激活的默认 Ui 使用它和 回调函数对网络管理器让您执行简单配对。有虚拟派生类的网络管理器的函数 可以使用自定义的 respoding 给matchmaker回调的行为。Customization自定义网络管理器的派生类上的虚拟函数可以使用自定义行为。当执行这些职能时,一定要照顾的默认实现提供的功能。 例如,在 OnServerAddPlayer(),NetworkServer.AddPlayer 函数必须调用到激活的Player对象连接。在Server/Host上调用的函数:// called when a client connects
public virtual void OnServerConnect(NetworkConnection conn);
// called when a client disconnects
public virtual void OnServerDisconnect(NetworkConnection conn)
NetworkServer.DestroyPlayersForConnection(conn);
// called when a client is ready
public virtual void OnServerReady(NetworkConnection conn)
NetworkServer.SetClientReady(conn);
// called when a new player is added for a client
public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
NetworkServer.AddPlayer(conn, player, playerControllerId);
// called when a player is removed for a client
public virtual void OnServerRemovePlayer(NetworkConnection conn, short playerControllerId)
if (conn.GetPlayer(playerControllerId, out player))
if (player.NetworkIdentity != null && player.NetworkIdentity.gameObject != null)
NetworkServer.Destroy(player.NetworkIdentity.gameObject);
// called when a network error occurs
public virtual void OnServerError(NetworkConnection conn, int errorCode);
在客户端调用的函数 :// called when connected to a server
public virtual void OnClientConnect(NetworkConnection conn)
ClientScene.Ready(conn);
ClientScene.AddPlayer(0);
// called when disconnected from a server
public virtual void OnClientDisconnect(NetworkConnection conn)
StopClient();
// called when a network error occurs
public virtual void OnClientError(NetworkConnection conn, int errorCode);
// called when told to be not-ready by a server
public virtual void OnClientNotReady(NetworkConnection conn);
匹配时调用的函数:// called when a match is created
public virtual void OnMatchCreate(CreateMatchResponse matchInfo)
// called when a list of matches is received
public virtual void OnMatchList(ListMatchResponse matchList)
// called when a match is joined
public void OnMatchJoined(JoinMatchResponse matchInfo)inspector
排名:第1515名
友情链接-我的世界
爱科技、爱游戏、有梦想、一起!
(18)(32)(129)(10)(1)(8)(11)(3)(15)(4)(1)(6)(7)(4)(6)(5)(4)(3)(2)(0)(5)(5)(2)(9)(2)(2)
我的微博 欢迎关注
当前系统时间如何评价Unity5中多人游戏和网络模块UNet_百度知道
如何评价Unity5中多人游戏和网络模块UNet
etworking是一种软件研发在跨平台路上更近一步的体现:anytime,真正做到了,anywhere,one code for all platform,Unity仍然是一个客户端游戏开发引擎! Networking出现之前。Networking出现之后,Unity甚至成为了跨客户端服务端的游戏开发引
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁UNET即将在5.x中闪亮登场-Unity自家的网络技术
Unity最近动作频频,就在最近推出了Unity for
PlayStation4,还有Unity for PlayStation Mobile,可谓野心不小。
当然,对很多开发者来说,特别是网络游戏的开发者,Unity自家的UNET也是吸引了大家的注意。
本文摘译自Unity官方博客,是关于Unity即将推出的最新网络技术(内部称之为UNET)的第三篇文章。
我们(Unity)希望UNET能够帮助所有的游戏开发者轻松创建多人在线游戏,不管是何种游戏类型,不管有多少数量的玩家,都可以帮助游戏开发者轻松搞定。
我们将在5.x版本中正式发布UNET.
关于UNET的简介,可以参考这篇文章:
或者继续阅读本文,了解关于UNET网络传输层的基础知识。
当开始为Unity设计新的网络库时,我们希望了解什么样的类库是开发者想要的理想库。最后我们将用户简单分为两类:
1.第一类用户只希望拥有一个简单易用的网络工具包,只需要很少的努力就可以实现自己想要的效果。
2.第二类用户则以开发网络游戏为主,他们希望非常灵活而又强大的工具。
基于这两种用户类型,我们把UNET的网络库分成两个部分:HLAPI(高级API)和LLAPI(低级API)。
当然,有经验的编程人员一眼可以看出,这个高级和低级其实类似于高级语言和低级语言的区别。
如果你希望了解更多关于高级API中所使用的Syncvars的信息,请阅读这篇文章:
接下来的讨论主要是关于低级API和我们的类库设计原则:
(1).性能,性能,性能…
LLAPI是一个基于UDP
socket的瘦层,大多数的工作都在一个单独的线程中进行(因此LLAPI可以通过设置来仅使用主线程)。没有动态内存分配,也没有heavy
synchronization(实际上大多数的类库使用带有atomic
increment/decrement操作的内存障碍同步。
(2).如果可以用C#搞定,那么就用C#
我们希望向开发者仅仅提供他们需要知道的东西。和BSD
socket类似,LLAPI仅支持一个抽象-交换原始二进制信息。在LLAPI中没有tpc一样的流,序列器或是RPC调用,只有低级信息。
(3).灵活性和可配置型?这个可以有
如果你看看TCP
socket的实现,会发现里面有无数的参数(超时,缓冲长度等等)可以进行调整。我们采取了类似的策略,开发者可以更改几乎所有的类库参数,这样就可以满足自己的定制化需要。当我们面临简单和复杂的选择时,我们牺牲了简单,以便尽可能的增加灵活性。
(4)方便易用
在设计LLAPI的时候,我们尽可能让它和BSD socket
API有相似性
(5)网络和传输层
从逻辑上来说,UNET的低级库是基于UDP的网络协议堆,其中包含了一个“network”层和一个”transport”层。网络层用于创建点到点的连接,发送包,以及控制流程和网络阻塞。传输层则使用属于不同通讯信道的”消息“。
UNET支持以下QOS:
(1)Unreliable
(2)UnreliableFragmented
(3)UnreliableSequenced
(4)Reliable
(5)ReliableFragmented
(6)ReliableSequenced
(7)StateUpdate
(8)AllCostDelivery
如果你发现自己的用例不符合以上任何一种类型,请给我们留下宝贵的建议。
原文更多信息请参考:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 unet 多人游戏 结算 的文章

 

随机推荐