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进行开发 实现数据绑 ...
随机推荐
- 阴影效果的小 demo
早上没事干,感觉字体阴影的效果还是好看的,那么就来一个小demo吧! 1.这是html 简单的有一个标签或者盒子都可以 <div class="demo11">我爱考试 ...
- oracle12c 新建表空间
第1步:创建临时表空间 create temporary tablespace jeeplus_temp tempfile 'D:\app\Administrator\virtual\product\ ...
- MySQL☞length函数
length(字符串/列名):求出该字符串/列名中字符的个数 格式: select length(列名) from 表名 如下图:
- 第三十五篇 类的内置属性(attr属性),包装和授权,__getattr__
双下划线开头的attr方法,都是类内置的方法. 一. 如果没有在类里定义这三个方法,调用的时候就调用类内置的默认的方法 class Too: pass # 类没有定义这三个属性,就用系统默认的方法 t ...
- ubuntu 开热点
原文地址:https://www.cnblogs.com/king-ding/archive/2016/10/09/ubuntuWIFI.html 今天教大家一个简单方法让ubuntu发散wifi热点 ...
- BZOJ 3670 NOI2014 动物园 KMP+dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3670 题意概述:令num[i]表示字符串由1~i的字符形成的前缀中不相重叠的相同前后缀的数 ...
- JavaSE复习(六)函数式接口
函数式接口 有且仅有一个抽象方法的接口 @FunctionalInterface注解 一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错.需要注 意的是,即使 ...
- 关于<!DOCTYPE html>的学习(转)
DOCTYPE是对Document type的缩写,说明用XHTML或者HTML是什么版本的.必须出现在<html>标签的前面,不需要关闭标签. <!DOCTYPE>声明不是标 ...
- 【历史】- Unix英雄传:图文细数十五位计算机先驱
Unix,一款多任务多用户操作系统,最早由AT&T公司员工及合作伙伴在贝尔实验室于1969年开发完成.Unix的衍生及克隆版本包括Berkeley Unix.Minix.Linux.AIX.A ...
- perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑
该标题可以抽象出来的问题是:两个前开后闭的区间 rangeA 和 rangeB,如何判断这两个区间是否重叠.这个问题在内核中非常重要,虚拟地址空间的划分需要它,perf中map_group的构建也需要 ...