首页 > 其他分享 >Netcode for Entities里如何对Ghost进行可见性筛选(1.2.3版本)

Netcode for Entities里如何对Ghost进行可见性筛选(1.2.3版本)

时间:2024-07-13 18:30:26浏览次数:14  
标签:Ghost Netcode 1.2 GhostRelevancySet GhostRelevancyMode GhostId 区域 设置

一行代码省流:SystemAPI.GetSingleton<GhostRelevancy>()

当你需要按照区域、距离或者场景对Ghost进行筛选的时候,Netcode for Entities里并没有类似FishNet那样方便的过滤方式,需要获取一个过滤专用的组件:GhostRelevancy
这个结构的内容不多,但功能很强大,但用起来很累,但概念其实挺简单的:设置Ghost和客户端的关联性。有关联就发送,或者有关联就不发送。

在1.2.3版本,它里面只有三个field:

  • GhostRelevancyMode:设置关联性的模式,默认是Disabled,既无视关联性,永远向每一个客户端发送每一个Ghost
    当设置成SetIsRelevant的时候,在后面的GhostRelevancySet里面设置的GhostId会被认为是“和客户端有关联的”,则这些Ghost会向客户端发送,未设置的则不会发送
    当设置成SetIsIrrelevant的时候,规则就会反过来。
  • GhostRelevancySet:是一个HashMap,其中Value值的那个int项是没有使用到的。也就是说是当个HashSet在用的。我不知道为啥这玩意儿没有做成NativeParallelHashSet,可能是写代码的时候Unity.Collection还没有吧。
  • DefaultRelevancyQuery:一个EntityQuery,根据前面GhostRelevancyMode设置的关联性模式,通过Query的结果判断是否有关联。不过根据Changelog,这个东西应该是1.3.0才有,然而在1.2.3就已经出现在代码里了。目前可以先不管他,鬼知道里面有没有什么BUG。

启用筛选的方式也很简单,下面是我用的方案。

首先做一个一次性执行的ISystem,设置好GhostRelevancyMode。比如设置成“有关联”模式:
SystemAPI.GetSingletonRW<GhostRelevancy>().ValueRW.GhostRelevancyMode = GhostRelevancyMode.SetIsRelevant;

接下来主要就是操作GhostRelevancySet了。方法是往里面填充大量的RelevantGhostForConnection结构。这东西就是一个NetworkId和一个GhostId。把你想让某个客户端看到的每一个Ghost都做一个RelevantGhostForConnection,一股脑全扔到GhostRelevancySet里,剩下的交给系统。

至于为什么NetCode没有选择用MultiHashMap?猛一看,每一个NetworkId对应多个GhostId,好像MultiMap是更适合的数据结构。其实是因为NetCode内部实现上是在遍历每一个Ghost所在的Chunk的时候,对着GhostRelevancySetContainsKey来判断这个Ghost要不要写到Snapshot里面去的。这种方式的话不用MultiHashMap反而是更高效的方法。具体的代码在GhostChunkSerializer.cs文件里,UpdateGhostRelevancy方法内。

因为我想做的是按区域过滤,比如玩家位于区域X的时候,那么就只将区域X和这个区域附近的一圈区域内的Ghost发送给他。而玩家会在不同的区域里晃来晃去,因此我操作GhostRelevancySet方法是做了一个Singleton Entity,称为SectorOperationCommands,上面有四个IBufferElementData,每一个都代表一个指令:

  • Ghost在区域X内生成
  • Ghost在区域X内删除
  • 玩家进入区域X
  • 玩家离开区域X

使用的时候就只需要往上面添加命令,然后写了一个ProcessSceneRelevancyCommandsSystem来统一处理。接下来调整它的执行顺序,确保它在所有Ghost/玩家的处理之后,GhostSendSystem之前执行即可。而GhostSendSystem是在SimulationSystemGroup里,EndSimulationEntityCommandBufferSystem后面执行的,所以只要不把处理GhostRelevancySet的ISystem丢到PresentationSystemGroup去,一般就不会有问题。

我又做了一个Singleton Entity,称为SectorInfoCollection,里面保存了所有区域的数据,比如某个区域里有哪些GhostId,有哪些NetworkId什么的。这样当玩家新进入一个特定区域的时候,要把哪些GhostId和他关联起来就很好处理了。同样的当这个区域里生成了一个Ghost,要把它和哪些NetworkId关联起来也一目了然。当然你也可以选择直接把这堆数据就放在ISystem里。因为我还要在别处用这些数据,所以做成了一个Entity。

对了,获取GhostId的方法是对着Ghost Entity来一发GetComponent<GhostInstance>()

代码就不贴了,我不喜欢在文章里贴大段大段的代码。重要的是传递概念,而不是写一堆不好CV还得人肉编译的英文符号。

标签:Ghost,Netcode,1.2,GhostRelevancySet,GhostRelevancyMode,GhostId,区域,设置
From: https://www.cnblogs.com/horeaper/p/18300471

相关文章

  • 六、STM32F4+标准库+LWIP2.1.2移植+无操作系统
    最快最简单的移植LWIP协议栈,可改可不改的东西统一不修改。后期学会了有能力了再回过头来修改,操作复杂理论复杂,同时讲解对新手不是很友好,故此此文档只讲操作无任何理论讲解。零、所需文件及环境          1、第四章建立好的串口2当调试口程序    2、......
  • 编译安装Kubernetes 1.29 高可用集群(9)--Harbor私有仓库部署
    1.环境说明操作系统:openEuler22.03软件版本:harbor2.10.32.Harbor软件安装2.1安装前准备#systemctldisablefirewalld.service#systemctlstopfirewalld.service#sed-i's/SELINUX=enforcing/SELINUX=disabled/'/etc/selinux/config#setenforce0#hostnamec......
  • Go 1.23 的 os.CopyFS:告别第三方库,轻松复制目录
    Go1.23的os.CopyFS:告别第三方库,轻松复制目录原创K8sCat源自开发者2024年07月10日21:49美国听全文在Go1.23版本中,标准库os包引入了一个名为CopyFS的新函数,它提供了一种仅使用标准库函数即可复制目录的便捷方法。从此,开发者无需再依赖第三方库来完成这项常见任务......
  • 从0开始装一套 KubeVirt 1.2.1
    KubeVirt架构架构virt-api:负责提供一些KubeVirt特有的api,像是console,vnc,startvm,stopvm等。virt-controller:管理和监控VMI对象及其关联的Pod,对其状态进行更新。virt-hander:以DaemonSet运行在每一个节点上,监听VMI的状态向上汇报,管理VMI的生命周......
  • 1.2 Jenkins简介
    简单介绍Jenkinsopeninnewwindow前身是Hudson,Jenkins是一款开源CI&CD软件,基于Java开发,用于自动化各种任务,包括构建、测试和部署软件。Jenkins支持各种运行方式,可通过系统包、Docker或者通过一个独立的Java程序。Jenkins项目产生两个发行线,长期支持版本(LTS)和每......
  • 编译安装Kubernetes 1.29 高可用集群(8)--Dashboard和Traefik安装部署
    1.部署Dashboard1.1在任意k8s-master节点上安装dashboard#helmrepoaddkubernetes-dashboardhttps://kubernetes.github.io/dashboard/#helmupgrade--installkubernetes-dashboardkubernetes-dashboard/kubernetes-dashboard--create-namespace--namespacekuberne......
  • Open-Sora1.2环境搭建&推理测试
    ​引子前阵子写了一篇Open-Sora1.0环境搭建&推理测试(Open-Sora1.0环境搭建&推理测试_自己搭建sora服务-CSDN博客,感兴趣的童鞋,请移步)。Open-Sora1.1发布的时候,撇了一眼新闻。后面一转头,忘记这个事情了。无意间翻到其开源网站上,发现2024.6.17发布1.2版本了,那还是过来看看有什么长足......
  • c++ primer plus 第15章友,异常和其他:15.1.2 友元成员函数
    #c++primerplus第15章友,异常和其他:15.1.2友元成员函数提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:15.1.2友元成员函数提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言15.1.2友元成员函数程序清单15.4tvfm......
  • 海康VM应用FAQ 1.2 全局脚本--方案加载后自动执行某流程
    【需求描述】VM方案加载成功后,自动执行某个流程。【应用场景】每次上电打开软件后,告知上位机软件准备就绪的信号;监控VM软件的运行状态,判断软件是否有奔溃,即Vm方案加载后连续运行某一流程,与上位机进行交互(与通信的心跳管理类似,不同的是通信的心跳只能监控通信是否断开,且仅为......
  • Minecraft Java 1.20.1 forge服务器搭建
    ☁️MinecraftJava1.20.1forge服务器搭建......