Mirror学习笔记(四) 权限管理

在这里插入图片描述


一、Interest Management权限管理器

Interest是新的全球权益管理系统.
在Mirro开发多人游戏时,当你不使用任何Interest管理组件时,默认情况下会以简单的广播的形式将消息送给各玩家。
在这里插入图片描述

与其将完整的世界状态发送给每个玩家,不如考虑仅将玩家周围的内容发送给玩家。
Interest Management主要有以下几点考虑:
1.规模:
像魔兽世界,将整个世界发送给每个玩家这是个非常疯狂的举动。为了扩展到数千个连接数,Mirror优化到只发送需要的消息给特定的玩家
2.可见性:
像在Dota/英雄联盟这样的MOBA游戏中,并不是每个人都需要一直看到其他人,玩家只需要看到自己队友爱周围怪物。
3.作弊:
像反恐精英等游戏中,玩家看不到墙后的敌人因为摄像机不会渲染。但是如果在各个客户端内存中是已知的,黑客则可以通过这点将敌人显示出来。也就是说解决以上问题Interest是一个不错的解决方案。
内置系统
选择Network Manager并添加内置的Interest Management.Mirror还包含其他几个系统
Spatial Hashing(空间哈希算法):
我们将每个网络身份系统迁移到全局并使用一个全局可见的方位,该设置对于场景中所有的内容都是相同的。
Distance(距离):
是Network Proximity Checker的代替品。
Scene(场景):
允许夸场景添加物理间隔。
Match(匹配):
将玩家隔离在非物理卡牌,棋盘,接机游戏的玩家。
Team(团队):
提供将联网对象可见性限定在团队成员中。这也可以用于所有的项目中,取代Network Owner Checker.
Custom(自定义):
Interest提供了一个模板,您可以使用它来自己的系统。
Legacy(旧版):
Interest Management 已弃用.
最后:
新的Interest Management 相当简单,允许大量定制。我们通过基于距离的了,这很容易理解。
你可能 已经注意到这是一个全局组件,但所有的功能 视乎都是围绕着一个身份的本地工作,有两个原因:
我们遗留的Interest Management系统在每个网络身份的基础上工作(也可以本 )。对于全局我们只是将这些功能移动到一个全局组件中。
1.这允许像Spatial Hashing这样全局捷俊方案,同时还保证可以保证功能耦合可以从旧系统轻松升级
2.Mirror忆将旧的系统移动的不同的地方,不需要担心
在正确的时间产生和消失的所有Interest管理 可能非常复杂。Mirror在NetworkServer中有一大堆InterestManagement管理代码,简单调用了上面三个函数。
这个做法是为了保护您免受复杂性的影响。你需要做的只是一次只关心一个网络 身份。这很容易被想到。


二、Spatial Hashing Interest 空间哈希权益管理

空间哈希算法权益管理听起来很复杂,实际上非常简单,如果您之前使用过uMMORPG 你可能会记得他是Grid Checker.但无论 如何我们都使用空间哈希管理,因为这是术语。
将Spatial Hashing Interest Management 组件添加到NetworkManager相同对像中:
使用方式:
在这里插入图片描述

工作原理:
以前我们用Vector3.Distance针对每个连接检查每个生成的实体。相反,我们将每个生成的实体放入一个Grid中,并且对每个连接,我们将所有8个京剧的风格条目发送给他。
在早起的uMMORPG测试中它比距离检查快30倍。该算法不太复杂。因此可以很好的扩展大量实体。在这里插入图片描述


三、Distance Interest Management

Distance Interest Management是最直接暴力的解决方案,简单的将范围内的实体信息发送出去。这就是Network Proximity Checker所做的.
在这里插入图片描述
代码中可以看出他是用Vector3.Distance检查距离。
唯一的缺点就是检查每一个连接和实体的成本比较高,因此如果需要大量连接实体,建议使用Spatial Hashing Interest Management
使用方式:
将Distance Interest Management添加到与Network Manager相同对像上
在这里插入图片描述

Vis Range:为可见范围
Rebuild Interval 重新构建时间以秒为单位,并确定Mirror重新计算对象对客户端的可见性频率。
自定义可见范围:
上面的可见范围是指作为默认范围适用于所有对象。你可以在需要不同方位的对像上覆盖此值,例如相对于场景中大多数其他事物而言,非常大或非常小的除外。
为此,只需要将Distance Interest Mnaagement自定义方位组件上添加到这些对象,并根据您的需要为这些对像设置可见范围值。
在这里插入图片描述


四、Scene Interest Management

Scene Interest Managemenet 与 Additive scene一起使用,将网络对像与物理间隔结合使用。这意味着及时你在服务器上加载了多个相同实力,对像之间的冲突也只会发生在该子场景内,而不会干扰到其他子场景。
服务器和连接的客户端总是加载相同的主场景。对于Additive Scene,这通常是一个容器场景,Additive子场景具有实际的场景内容。
使用方式:
在这里插入图片描述
将Scene Interest Management组件添加到Network Mnaager相同的对像上
在每个子场景中,添加一个空游戏对象,并向其中添加一个物理模拟器组件。由附加场景将作为物理场景添加到服务器上,Unity不会为他们模拟物理,因此该组件会在每个子场景中为您执行此操作。
在这里插入图片描述
同样在每个子场景中,一个名为Environment并带有Network Identity的空游戏对象,并使所有静态非网络内容成为该对象的子对象。通常这将包括风景,建筑,道路和其他非交互内容。
在这里插入图片描述
不要在Environment 对像下放置任何将联网和或可能与玩家互动的东西,如门,车,售货机等。
当您实力化玩家或其他网络对像时,Unity没有任何内置机制来指定对象实力化到哪个子场景…
它始终是活动场景,也就是我们的窗口场景。在实力化前调用SceneManaager.MoveGameObjectToScene将对象移动到正确的子场景中。一但被生成,它将对具有相同子场景中的玩家对像客户端可见。
如果移动到另一个子场景,新旧子场景中的可见性会自动更新。
请注意,互联对像仅移动到上的子场景。客户端生成窗口场景中的所有内容,无需将对像移动到客户端的子场景中,因为它们一次加载一个子场景。


五、Match Interest Management

Match Interest Managemenet 此管理器不支持用于基于物理的游戏,建议改用Scene Interest Management.
适用于非物理游戏,如:棋牌 街机游戏等。
使用方式:
将Match InterestManagemenet添加到Network Manager组件的对像上
在这里插入图片描述
并为所有网络对像,包括Player预制体,添加Network Match.
在这里插入图片描述
在运行时,将相同的matchId分享给属于同一个匹配的玩家对象。


六、Team Interest Management

Team Interest Managemenet 使用玩家对像上的网络团队管理器,提供了公对同一团队中的人可见的联网对像。
使用方式 :
添加Team Interest Management组件到Network Manager相同的对象上:
在这里插入图片描述
将Network Team 组件添加到玩家预制体和属于团队的其他预制体上。在运行时将同一团队中的玩家/对象是指为相同Id.
在这里插入图片描述

在玩家对象上切图强制显示,以便 其他团队玩家也可以看到他们。
通过为每个玩家哟一的团队ID值,您可以实现类假于Network Owner Checker的功能。


七、CustomInterest Management

Custom Interest Managemenet 允许您实施自定义管理方案,例如:
1.基物Raycast,因此Dota玩家看不到墙后或灌木中的其他玩家
Counter-Strike类游戏的预测性光线投射。穿墙外挂显示玩家在墙后。您可以创建一个CustomInterest Managermenet,仅在敌人从培后弹出前不久将其发送给玩家。在第一人称设计游戏中,玩家移动速度很快,所以你仍需要在他们变得可见之前预留几毫秒。
以上所有的自定义解决方案可以Mirror中实现。要了解如使用Custom Interset Management让我们一步步来。
Script Temp脚本模板
Mirror包含用于Custom Interest Management脚本在内的所有脚本。它完全注释了所有已经为您存根的虚拟方法。如果您之前 使用过旧版的Custom Interset Managemenet 那么他们是类似的。
OnCheckObserver:
当有人生成调用,如果newObserver可以看到Identity返回true.
OnRebuildObservers:
为给定网络身份的重建 观察者。结果储存在newObservers中。
Mirror会在内部自动newObservers放入identity.observers中,我们不直接这样做,因为比添加/删除更复杂,但由Mirror负责管理由没什么可怕的。
RebuildAll:
是一个帮助函数,用于重建每个生成的风格身份对察者。
实现可能希望在每个间隔调用它。

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值