注意:已弃用 UNet,未来会将其从 Unity 中删除。一个新系统正在开发中。有关更多信息和后续步骤,请参阅博客文章。 |
在 Unity 的高级 API (HLAPI) 系统中,多人游戏包括:
服务器:服务器是所有其他玩家在想要一起玩游戏时连接的游戏实例。服务器通常管理游戏的各个方面,例如保存分数并将该数据传送回客户端。
客户端:客户端是通常从不同计算机连接到服务器的游戏实例。客户端可以通过本地网络或互联网进行连接。
客户端是连接到服务器的游戏实例,因此游戏玩家可以与在自己客户端上连接的其他玩家一起玩游戏。
服务器可以是“专用服务器”,也可以是“主机服务器”。
专用服务器:这是完全为了作为服务器而运行的游戏实例。
主机服务器:当没有专用服务器时,其中一个客户端也可以扮演服务器的角色。该客户端是“主机服务器”。主机服务器创建游戏的单个实例(称为主机),此实例将同时充当服务器和客户端。
下图表示了多人游戏中的三名玩家。在此游戏中,一个客户端同时充当主机,这意味着该客户端本身为“本地客户端”。本地客户端连接到主机服务器,二者都在同一台计算机上运行。另外两个玩家是远程客户端,也就是说,它们位于不同的计算机上,但均连接到主机服务器。
主机是游戏的单个实例,同时充当服务器和客户端。主机使用特殊类型的内部客户端进行本地客户端通信,而其他客户端则是远程客户端。本地客户端通过直接函数调用和消息队列的形式与服务器进行通信,因为它在同一个进程中。本地客户端实际上与服务器共享场景。远程客户端通过常规网络连接与服务器通信。如果使用 Unity 的 HLAPI,这一切都将自动处理。
Multiplayer 系统的目标之一是使本地客户端和远程客户端的代码保持一致,这样在开发游戏时大多数时间只需要考虑一种类型的客户端。在大多数情况下,Unity 会自动处理这种差异,因此您基本不需要考虑在本地客户端或远程客户端上运行的代码之间的差异。
在 Unity 中开发单人游戏时,通常使用 GameObject.Instantiate
方法在运行时创建新的游戏对象。但是,对于 Multiplayer 系统,服务器本身必须“生成”游戏对象,使这些游戏对象在联网游戏中处于活动状态。服务器生成游戏对象时,会触发在连接的客户端上创建游戏对象的行为。生成系统负责管理游戏对象的生命周期,并根据游戏对象的设置同步游戏对象的状态。
有关联网实例化和生成的更多详细信息,请参阅关于生成游戏对象的文档。
Unity 的多玩家 HLAPI 系统对玩家游戏对象的处理方式不同于对非玩家游戏对象的处理方式。当新玩家加入游戏时(当新客户端连接到服务器时),该玩家的游戏对象成为该玩家客户端上的“本地玩家”游戏对象,并且 Unity 将玩家的连接与玩家的游戏对象相关联。Unity 为每个游戏玩家关联一个玩家游戏对象,并将网络命令路由到这一个游戏对象。一个玩家不能在另一个玩家的游戏对象上调用命令,只能在自己的游戏对象上调用命令。
有关更多详细信息,请参阅关于玩家游戏对象的文档。
服务器和客户端都可以管理游戏对象的行为。“授权”的概念是指如何以及在何处管理游戏对象。Unity 的 HLAPI 在默认状态下基于“服务器授权”,这种情况下的服务器(主机)对所有不代表玩家的游戏对象具有授权。玩家游戏对象是一种特殊情况,被视为具有“本地授权”。有时可能希望使用不同的授权系统构建游戏;有关更多详细信息,请参阅网络授权。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.