Unity-Unet-自定义可视化区域范围(NetworkProximityChecker)

NetworkProximityChecker组件是基于与玩家的邻近度来控制网络客户端的GameObjects的可见性。下面就给大家介绍下如何实现自定义可视化区域范围。

要求
  • 类似于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>();
www.nainaitea.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值