unity官方内置网络unet的实例教程(三)

本文是Unity官方内置网络Unet的实例教程第三部分,讲解如何注册玩家预制体并实现网络同步。通过添加NetworkIdentity组件、编写PlayerController脚本来控制玩家移动,然后使用NetworkTransform组件实现位置同步。在联机测试中,解决了主机和客户端游戏状态不同步的问题,最终实现了网络游戏中玩家位置的实时同步。
摘要由CSDN通过智能技术生成

注册玩家预制体

当我们完成玩家预制体的制作,并添加了网络组件NetworkIdentity之后需要在我们的 Network Manager中进行注册。首先,选中Hierarchy面板中的Network Manager ,将玩家预制拖进下图中的空白位置



注册一

我们开始让玩家移动吧,不然也太无聊了,不过首先,还是按照老办法制作单机移动的脚本吧。

新建文件夹,重命名为Scripts,然后进入文件夹右键新建C#脚本,重命名为:PlayerController ,将此脚本托到Player预制体的属性面板的下方。(也可选中Player预制体,在属性面板中添加新脚本再将脚本放进Scripts文件夹中)



添加脚本

接着双击脚本,我使用的VS2017,来编辑代码,这里用最简单的方式实现移动:

(为了方便大家练习,我这里做成了图片的格式,来动手写个吧)



玩家移动代码-单机

接着,让我们点击运行的”三角“按钮测试下吧,点击后左上角出现这样的显示



界面

点击最上面的 Host ,运行游戏,左上角变成了这样的界面:



运行后的界面

左侧的Hierarchy面板显示,有个玩家的预制被克隆出来,中是这样的:



克隆了玩家的预制体

随便按上下左右试试。不过我们要做的是网络游戏啊,我们试试联机后效果咋样吧。退出运行模式,保存游戏。

点击左上角File先择Build Settings,或者使用快捷键也可以。设置如下:



生成的设置1

然后这里的设置:



生成的设置2

最后点击Build 或者Build&Run 按钮,生成游戏的运行程序。点击运行的.exe文件,运行游戏,点击Lan Host进入游戏,在打开Unity编辑器中的运行模式,选择Lan Client 联接主机,再试试玩家的移动看看。

你会发现,你可以一起控制这两个角色,而且主机和客户端的游戏不能同步,完全是两套人马。太不爽了!

让我们进行网络同步吧!

首先,我们先更新下我们的 PlayerController 脚本。



脚本


因为游戏已经进行了更新,所以,我们得重新生成游戏(Build游戏)。按照上面的方法再生成来一次,完成之后,点击Lan Host运行,再打开Unity运行点击Lan Client进行联机,进入游戏后我们发现,我们可以分别控制主机和客户端啦,不是两个同时控制。但是还有点不好的就是他们的位置在一个游戏里面改变却没有在另一个里面进行同步,所以他们还是各自为政。

退出运行,在Unity中找到player 预制prefab(prefabs文件夹里面),添加NetworkTransform组件,然后保存游戏。



添加的组件


再一次生成下游戏(Build游戏),生成完之后,点击Lan Host运行,再打开Unity运行点击Lan Client进行联机。可以按键实验下,发现他们的位置已经同步了,虽然有些卡,但是基本功能还是实现了。

官网对这部教程进行了说明,内容如下:

在一个联网的项目中,服务器和所有的客户端在同一个GameObjects上执行同一个脚本上相同的代码。这意味着,在服务器和两个客户端的情况下,将会有六个潜在的玩家GameObjects被处理。这是因为在服务器上会有两个玩家,因此会有两个玩家GameObjects。两个客户中每个都会有两个玩家。这使得共有六个玩家GameObjects。见下图:


示例图

所有这些玩家GameObjects都是从同一个玩家预制体中产生的,并且都共享同一个PlayerController脚本的副本。使用从NetworkBehaviour派生的脚本,角色自己会“自动判断”产生和管理自己相关的GameObject。 LocalPlayer是本地客户端“拥有”的玩家GameObject。当客户端连接到服务器时,NetworkManager会设置权限,并从角色的预制中创建新玩家GameObjects。当客户端连接到服务器时,本地客户端上创建的实例被标记为LocalPlayer。所有其他玩家GameObjects(无论是在服务器还是另一个客户端上)都不标记为LocalPlayer。

这个NetworkTransform组件 可以在网络上同步GameObject的变换。因为有isLocalPlayer的判断,本地玩家移动本地玩家的GameObject时,只移动本地的玩家GameObject。然后,其他玩家GameObject的NetworkTransform在服务器和所有客户端之间,同步这个GameObject的变换的位置,旋转和缩放比例。

应该记住的是,所有网络应用程序都将在一定程度上受到延迟的影响,经常会受到在客户端和服务器之间数据传输的速度的限制。有很多方法可以优化延迟。例如,NetworkTransform具有网络发送速率设置,可用于设置NetworkTransform发送同步数据的频率。客户端和服务器之间的网络更新频率可能会对网络多人游戏的感受产生重大影响。然而,更重要的是,网络应用程序可以通过多种方式一起处理差异,无论这些差异来自于简单的延迟还是由于同步更新的频率。这些解决方案可以包括插值,外推和许多其他形式的平滑和预测。但本课程都不包括在内。

值得铭记的几个要点。需要在同步状态发生的频率和游戏的表现之间取得平衡。如果游戏尝试通过网络太频繁地同步太多的数据,那么游戏的表现将会受到影响。如果一个游戏没有足够的数据同步数据,那么游戏和游戏的感觉就会受到影响。在一般情况下,需要对同步的GameObjects进行某种形式的解释,以使所有客户端在运行时保持平滑和同步。所有多人网络游戏的同步都不是完美的,因为在目前的网络、硬件等基础上,这不太可能。两个或多个远程客户端不可能处于完全相同的状态。然而,为了获得玩家最佳的体验游戏,我们需要让他们感觉好像完美地同步了,即使每个不同的客户端在其确切状态下稍微有一些不同。其他课程将详细介绍如何做到这一点。

请关注简书 赋大松

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值