// leave离开self视野 public static void LeaveSight(this AOIEntity self, AOIEntity leave) { if (self.Id == leave.Id) { return; } if (!self.SeeUnits.ContainsKey(leave.Id)) { return; } self.SeeUnits.Remove(leave.Id); if (leave.Unit.Type == UnitType.Player) { self.SeePlayers.Remove(leave.Id); } leave.BeSeeUnits.Remove(self.Id); if (self.Unit.Type == UnitType.Player) { leave.BeSeePlayers.Remove(self.Id); } Game.EventSystem.Publish(self.DomainScene(), new EventType.UnitLeaveSightRange { A = self, B = leave }); }
// enter进入self视野 public static void EnterSight(this AOIEntity self, AOIEntity enter) { // 有可能之前在Enter,后来出了Enter还在LeaveCell,这样仍然没有删除,继续进来Enter,这种情况不需要处理 if (self.SeeUnits.ContainsKey(enter.Id)) { return; } if (!AOISeeCheckHelper.IsCanSee(self, enter)) { return; } if (self.Unit.Type == UnitType.Player) { if (enter.Unit.Type == UnitType.Player) { self.SeeUnits.Add(enter.Id, enter); enter.BeSeeUnits.Add(self.Id, self); self.SeePlayers.Add(enter.Id, enter); enter.BeSeePlayers.Add(self.Id, self); } else { self.SeeUnits.Add(enter.Id, enter); enter.BeSeeUnits.Add(self.Id, self); enter.BeSeePlayers.Add(self.Id, self); } } else { if (enter.Unit.Type == UnitType.Player) { self.SeeUnits.Add(enter.Id, enter); enter.BeSeeUnits.Add(self.Id, self); self.SeePlayers.Add(enter.Id, enter); } else { self.SeeUnits.Add(enter.Id, enter); enter.BeSeeUnits.Add(self.Id, self); } } Game.EventSystem.Publish(self.DomainScene(), new EventType.UnitEnterSightRange() { A = self, B = enter }); }