View Code? Open in Web Editor
NEW
This project forked from misaka-mikoto-tech/variableview
MMO RPG 中可变视野及巨型实体的视野处理
License: MIT License
variableview's Introduction
本代码的功能是演示一种视野处理方式,可以满足的需求有:
- 每个地图可以单独设置不同的格子大小,格子大小影响视野精度,也会对内存和计算量产生影响。
- 每个实体的单位都是游戏内的真实单位而不是格子数。
- 可以实现动态的更改实体的可视距离以便满足获得千里眼道具后可以看的更远等类似需求。
- 可以动态修改实体体积以实现变身等功能。
- 将地图划分成等大的格子,每个格子内存储位于当前格子内的实体对象链表和正在关注当前格子的实体链表。
- 实体对象存储它正在关注的所有格子以及它所占据的格子,如果是非质点实体那么它将同时存在于多个格子上。
- 格子内的实体数量发生改变时向关注此格子的所有关注者广播事件。
- 实体移动时更改自己所在的格子,触发旧格子内的实体离开事件和新格子的实体进入事件,实体移动后更新自己的关注列表,找出不再关注的格子,把自己从对应格子反注册,找出新关注的格子,将自己注册进去(此处用了一个快速求两个集合的交集和差集的算法,见
Utils.cs
)
- 实体更改自己的视野时向变更的相关格子关注者列表注册或反注册自己。
- 实体更改自己的体积时同时修改发生变更的占据格子和关注格子(比较耗资源)。
![image](https://github.com/easy66/VariableView/raw/master/Result.png)
- 对于大型实体,可能会出现实体的一部分进入观测者视野,而另外一部分离开观察者视野的情况,出现通知也有可能会发送多次,解决方案如下:
- 出现协议: 服务端发送多次,客户端根据需求忽略。
- 移动及攻击判定: 对于有离开也有出现的服务端可以根据需求直接拦截掉不处理或者酌情处理(大型实体需要确定被攻击的部位的情况)。
- 格子数太多: 可以把正方形格子修改为六边形格子以减少格子数。
variableview's People
Contributors