要求
- 类似于AOI,在超过范围的物体不绘制,也不同步。
- 减少客户端不必要的绘制和计算
效果图
1、简单使用
在UNET中使用很简单,只需要在不销毁的实例中挂上一个 NetworkProximityChecker 组件,调整可视范围 Vis Range 即可
里面的实现是 通过物理碰撞框来找到可视对象
AخA
1
var hits = Physics.OverlapSphere(transform.position, visRange);
所以需要 被可视 的对象要加上一个 Collider 组件
2、自定义使用
新建一个类继承 NetworkProximityChecker,重写 OnRebuildObservers 方法。
有些时候会把 Collider 组件丢在某个 节点A 的父节点 节点B上,而需要 被可视 的节点不是A而是B,就要下面这样干了
48
1
public override bool OnRebuildObservers(HashSet<NetworkConnection> observers, bool initial)
2
{
3
if (forceHidden)
4
{
5
// ensure player can still see themself
6
var uv = GetComponent<NetworkIdentity>();
7
if (uv.connectionToClient != null)
8
{
9
observers.Add(uv.connectionToClient);
10
}
11
return true;
12
}
13
// find players within range
14
switch (checkMethod)
15
{
16
case CheckMethod.Physics3D:
17
{
18
var hits = Physics.OverlapSphere(transform.position, visRange);
19
foreach (var hit in hits)
20
{
21
// (if an object has a connectionToClient, it is a player)
22
//var uv = hit.GetComponent<NetworkIdentity>(); // < -----DEFAULT
23
var uv = hit.GetComponentInParent<NetworkIdentity>(); // <----- MODIFIED
24
if (uv != null && uv.connectionToClient != null)
25
{
26
observers.Add(uv.connectionToClient);
27
}
28
}
29
return true;
30
}
31
case CheckMethod.Physics2D:
32
{
33
var hits = Physics2D.OverlapCircleAll(transform.position, visRange);
34
foreach (var hit in hits)
35
{
36
// (if an object has a connectionToClient, it is a player)
37
//var uv = hit.GetComponent<NetworkIdentity>(); // < -----DEFAULT
38
var uv = hit.GetComponentInParent<NetworkIdentity>(); // <----- MODIFIED
39
if (uv != null && uv.connectionToClient != null)
40
{
41
observers.Add(uv.connectionToClient);
42
}
43
}
44
return true;
45
}
46
}
47
return false;
48
}
相对于源码只改了一行代码就是
1
1
var uv = hit.GetComponent<NetworkIdentity>();
改为
1
1
var uv = hit.GetComponentInParent<NetworkIdentity>();