egametang / ET

Unity3D Client And C# Server Framework
Other
8.76k stars 2.99k forks source link

解决AOI自己进入自己视野数据问题。 #532

Closed anjiev5 closed 9 months ago

anjiev5 commented 9 months ago

调试的时候发现在AOIManagerComponentSystem Add 方法调用时,出现了自己进入自己视野的情况,主要原因是43行这里 kv.Value.EnterSight(aoiEntity); 之前没有做自身id判断导致。所以优化代码,id判断统一放在 EnterSight 和 LeaveSight 里,避免调用时忘记判断自身id这种情况。

egametang commented 9 months ago

这个应该不是问题,还更加容易广播了,比如自己数值变化直接广播出去,自己也被广播了

anjiev5 commented 9 months ago

这个应该不是问题,还更加容易广播了,比如自己数值变化直接广播出去,自己也被广播了

EnterSight 这个方法最后会发送 UnitEnterSightRange 事件 ,但UnitEnterSightRange_NotifyClient 里面会再次判断

AOIEntity a = args.A; AOIEntity b = args.B; if (a.Id == b.Id) { return; }

所以事件根本就不会 广播出去,只是自己进入自己视野的数据会一直放在 SeeUnits BeSeeUnits SeePlayers BeSeePlayers 这4个集合里,猫大你可以debug 看一下。

anjiev5 commented 9 months ago

这个应该不是问题,还更加容易广播了,比如自己数值变化直接广播出去,自己也被广播了

EnterSight 这个方法最后会发送 UnitEnterSightRange 事件 ,但UnitEnterSightRange_NotifyClient 里面会再次判断

AOIEntity a = args.A; AOIEntity b = args.B; if (a.Id == b.Id) { return; }

所以事件根本就不会 广播出去,只是自己进入自己视野的数据会一直放在 SeeUnits BeSeeUnits SeePlayers BeSeePlayers 这4个集合里,猫大你可以debug 看一下。

虽然这些数据对结果不会产生影响,但感觉到最后 AOIEntity Destroy 的时候 因为会调用 self.Scene().GetComponent()?.Remove(self); 然后触发最后的检查log

// 检查 if (aoiEntity.SeeUnits.Count > 1) { Log.Error($"aoiEntity has see units: {aoiEntity.SeeUnits.Count}"); }

        if (aoiEntity.BeSeeUnits.Count > 1)
        {
            Log.Error($"aoiEntity has beSee units: {aoiEntity.BeSeeUnits.Count}");
        }
egametang commented 9 months ago

我是说自己被自己看见,然后获取beSeePlayers的时候会包含自己,这样如果自己如果数值减少广播的时候可以广播给自己。不然广播的BroadCast方法要额外加上自己,这样就比较麻烦

anjiev5 commented 9 months ago

我是说自己被自己看见,然后获取beSeePlayers的时候会包含自己,这样如果自己如果数值减少广播的时候可以广播给自己。不然广播的BroadCast方法要额外加上自己,这样就比较麻烦

懂了,感谢猫大答疑。