private void OnDiffedEvent(TotalHealthDiff diff) { var container = writer.Data.TroopContainer; var simpleUnits = container.SimpleUnits; var count = simpleUnits.Count; if (count == 0) { return; } var perDamage = diff.HealthDiff / count; var keys = simpleUnits.Keys; foreach (var k in keys) { var simple = simpleUnits[k]; simple.Health = Mathf.Max(0, simple.Health - perDamage); simpleUnits[k] = simple; } container.SimpleUnits = simpleUnits; writer.SendUpdate(new VirtualTroop.Update() { TroopContainer = container, }); }
protected override void OnUpdate() { if (CheckTime(ref inter) == false) { return; } var damageDic = new Dictionary <EntityId, TroopDamage>(); Entities.With(group).ForEach((Entity entity, ref VirtualTroop.Component troop, ref BaseUnitStatus.Component status, ref SpatialEntityId entityId) => { if (status.State != UnitState.Alive) { return; } var trans = EntityManager.GetComponentObject <Transform>(entity); var pos = trans.position; var boidRange = RangeDictionary.GetBoidsRange(status.Rank); var range = boidRange * sightRate; var unit = getNearestPlayer(pos, range, selfId: null); if ((unit == null) == troop.IsActive) { if (CheckConflict(ref troop, status.Side, trans, status.Rank, out var damage)) { damageDic[damage.id] = damage; } } else { UpdateContainer(ref troop, unit == null, status.Side, trans, boidRange, status.Rank); } }); // SendDamage foreach (var kvp in damageDic) { var diff = new TotalHealthDiff(kvp.Value.healthDiff); this.UpdateSystem.SendEvent(new VirtualTroop.TotalHealthDiff.Event(diff), kvp.Key); } }