美文网首页unity官方教程合集
unity官方内置网络unet的实例教程(三)

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

作者: e566c99b4645 | 来源:发表于2017-11-07 23:22 被阅读411次

    本课程的地址:

    第一节.www.jianshu.com/p/d4e35e547081

    第二节:www.jianshu.com/p/d7481e83317c

    第四节:www.jianshu.com/p/5b211f3f4ec6

    第五节:www.jianshu.com/p/cb034b4c317d

    第六节:www.jianshu.com/p/c58c1a888595

    第七节:www.jianshu.com/p/b8cc2d15e2b5

    第八节:www.jianshu.com/p/9f8f18a46266

    注册玩家预制体

    当我们完成玩家预制体的制作,并添加了网络组件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进行某种形式的解释,以使所有客户端在运行时保持平滑和同步。所有多人网络游戏的同步都不是完美的,因为在目前的网络、硬件等基础上,这不太可能。两个或多个远程客户端不可能处于完全相同的状态。然而,为了获得玩家最佳的体验游戏,我们需要让他们感觉好像完美地同步了,即使每个不同的客户端在其确切状态下稍微有一些不同。其他课程将详细介绍如何做到这一点。

    相关文章

      网友评论

        本文标题:unity官方内置网络unet的实例教程(三)

        本文链接:https://www.haomeiwen.com/subject/nwhsmxtx.html