unet中可视性检查的一些笔记
最近在尝试用unet做一个局域网游戏,游戏的核心概念在于玩家之间的发现和隐蔽,有个类似于战争迷雾的机制。
实现该机制最关键的是实现可视性检查。首先是unet中默认的一个可视性检查,由组件NetworkProximityChecker实现。其具体原理在 https://docs.unity3d.com/Manual/UNetVisibility.html 中有详细叙述,简单地说就是:
所有的networkIdentity都有一个观察者observer列表
在运行后的inspector下可以看到
值得注意的是,observer列表里保存的是player的gameobject。
这个observer列表表示,该物体被哪些networkConnection可见,对于不可见的networkConnection,server不会去做类似同步syncVar、或者调用clientRPC之类的操作。
按照文档的说法,这个observer列表会在两种情况下更新:
第一种情况:
在一个client被设置成ready之后,要对所有的network gameobject检查client能否看到它。该gameobject下的所有的networkBehaviour里的OnCheckObserver(NetworkConnection)会被调用,返回false表示该NetworkConnection看不到该gameobject。
第二种情况:
1.一个network gameobject在server上被spawn,要对所有的networkConnection检查能否看到该gameobject。
2.该gameobject中的,NetworkIdentity的RebuildObservers()方法被调用。需要重建Observers,该函数会调用同gameobject中的networkbehaviour中的onRebuildObservers
3.该方法签名如下
public override bool OnRebuildObservers(HashSet observers, bool initial);
实现者通过填充observers来表示哪些networkConnection对该gameobject可见。
注意两种方式的根本区别:第一种方式是一个新NetworkConnection进入后(client ready后),所有的network gameobject进行一次检查。第二种是一个network gameobject被创建后,所有的NetworkConnection做一次检查。
NetworkProximityChecker override了OnCheckObserver和OnRebuildObservers两个方法,通过检查距离实现检查。为了可见性能够刷新,同时在Update里定期调用NetworkIdentity的RebuildObservers方法。
以上是observer列表构建的一些事项。
之后,server会根据每个物体observers表的变化来对新增或者删除的networkConnection发送消息。比较麻烦的是在host上和client上的行为是不同的。
在client上,当一个物体可见性改变时,会收到来自服务器的消息。要注意的是,这个消息和在服务器上直接删除、创建物体时发送给客户端的消息是一模一样的。
而在host上,因为host本身的scene就是server的scene,不能直接把物体删除(不然就真没了)。因此需要另外实现行为。networkBehaviour提供了一个虚函数OnSetLocalVisibility(bool),这个函数只有在host上,失去或获得一个物体的可见性时被调用。在NetworkProximityChecker中实现的是把Renderer全部禁用或者启用,就实现了看不见的效果。不过因为UI的Canvas继承自Monobehaviour,消失时是不会被禁用的,如果要禁用的话需要自己实现一个component并且override OnSetLocalVisisbility。
unet中可视性检查的一些笔记的更多相关文章
- MySQL中Procedure事务编写基础笔记
原文:MySQL中Procedure事务编写基础笔记 目录: 一.PROCEDURE: 二.CREATE PROCEDURE基本语法: 三.PROCEDURE小进阶 3.1.基本的DECLARE语 ...
- RSYNC在zabbix中的检查
RSYNC在zabbix中的检查 作者:高波 归档:学习笔记 2017/08/21 快捷键: Ctrl + 1 标题1 Ctrl + 2 标题2 Ctrl + 3 标题3 Ctr ...
- 浏览器中js执行机制学习笔记
浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...
- jquery中关于append()的用法笔记---append()节点移动与复制之说
jquery中关于append()的用法笔记---append()节点移动与复制之说 今天看一本关于jquery的基础教程,看到其中一段代码关于append()的一行,总是百思不得其解.于是查了查官方 ...
- SQL中如何检查死锁
SQL中如何检查死锁 编写人:CC阿爸 2014-6-15 在日常SQL数据库的操作中,SQL偶尔会出现表被死锁的问题.比如: 在执行事务时,突然中止事务.系统肯定会锁表. 大批量数据操作时,由于网络 ...
- JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue
前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...
- JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...
- 安全运维中基线检查的自动化之ansible工具巧用
i春秋作家:yanzm 原文来自:安全运维中基线检查的自动化之ansible工具巧用 前几周斗哥分享了基线检查获取数据的脚本,但是在面对上百台的服务器,每台服务器上都跑一遍脚本那工作量可想而知,而且都 ...
- 第63节:Java中的Spring MVC简介笔记
前言 感谢! 承蒙关照~ Java中的Spring MVC简介笔记 MVC简介 Spring MVC 基本概念 Spring MVC 项目搭建 maven 使用Spring MVC进行开发 实现数据绑 ...
随机推荐
- jq 一个强悍的json格式化查看工具
本文来自网易云社区 作者:娄超 在web 2.0时代json这种直观.灵活.高效数据格式基本已经成为一种标准格式,从各种web api,到配置文件,甚至现在连mysql都开始支持json作为数据类型. ...
- runtime总结 iOS
Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢.我们从下面几个方面探寻Runtime的实现机制. Runtime介绍 Runtime消息传递 ...
- bug单的提交
顶头信息 所属产品,所属项目,所属模块,影响版本,当前指派,bug类型:代码错误,界面优化,设计缺陷,性能问题,标准规范,其他,安全相关.bug标题,严重程度,优先级 缺陷描述 bug描述,预置条件, ...
- 图解Transformer
图解Transformer 前言 Attention这种机制最开始应用于机器翻译的任务中,并且取得了巨大的成就,因而在最近的深度学习模型中受到了大量的关注.在在这个基础上,我们提出一种完全基于Atte ...
- 腾讯云,搭建 FTP 文件服务
腾讯云,搭建 FTP 文件服务 腾讯云,搭建 FTP 文件服务 安装并启动 FTP 服务 任务时间:5min ~ 10min 安装 VSFTPD 使用 yum 安装 vsftpd: yum insta ...
- MySQL日常管理
DB2最佳分页语句 SELECT * FROM ( SELECT inner2_.*, ROWNUMBER() OVER(ORDER BY ORDER OF inner2_) AS rownumber ...
- document.querySelector()和document.querySelectorAll()
HTML5向Web API新引入了 document.querySelector()和document.querySelectorAll()两个方法,都可以接收三种类型的参数:id(#),class( ...
- vsCode怎么为一个前端项目配置ts的运行环境
vsCode为一个前端项目配置ts的运行环境,ts文件保存的时候自动编译成js文件: 假设此前端项目名称为Web:文件结构如图 1. 在根目录中新建一个“.vscode”文件夹,里面建一个“tasks ...
- dechex()
dechex() 函数把十进制转换为十六进制生成验证码的时候用到了
- JSP表单提交出现中文乱码的解决方法
1)post方式 在servlet的doGet( ) doPost( ) 中增加以下代码: response.setContentType("text/html;charset=utf- ...