void Start()
 {
     Simulation = new Simulation.SimWorld();
     Simulation.PathingMap = GameObject.FindObjectOfType<Simulation.PathingMap>();
     var entities = GameObject.FindObjectsOfType<Entity>();
     for (int e = 0; e < entities.Length; ++e) {
         var entity = entities[e];
         var simEntity = new Simulation.SimEntity(e);
         simEntity.Player = entity.Player;
         simEntity.Position.Value = entity.Position;
         entity.Bind(simEntity);
         foreach (var component in entity.GetComponentsInChildren<MonoBehaviour>()) {
             var mapping = (SimulationMappingAttribute[])component.GetType().GetCustomAttributes(typeof(SimulationMappingAttribute), true);
             if (mapping != null && mapping.Length > 0) {
                 var simType = mapping[0].SimulationType;
                 var simCmp = (Simulation.SimComponent)Activator.CreateInstance(simType);
                 foreach (var field in component.GetType().GetFields()) {
                     if (field.DeclaringType.IsAssignableFrom(typeof(MonoBehaviour))) continue;
                     var simFld = simCmp.GetType().GetField(field.Name);
                     if (simFld == null) continue;
                     simFld.SetValue(simCmp, field.GetValue(component));
                 }
                 if (component is PathEntity) {
                     var pathEntity = (PathEntity)component;
                     var simPEntity = (Simulation.SCPathEntity)simCmp;
                     var boxC = pathEntity.BoundCollider;
                     if (boxC != null) {
                         var size = Vector3.Scale(boxC.size, entity.transform.localScale);
                         var polygon = new Simulation.Polygon(
                             new Vector2(boxC.center.x - size.x / 2, boxC.center.z - size.z / 2),
                             new Vector2(boxC.center.x + size.x / 2, boxC.center.z - size.z / 2),
                             new Vector2(boxC.center.x + size.x / 2, boxC.center.z + size.z / 2),
                             new Vector2(boxC.center.x - size.x / 2, boxC.center.z + size.z / 2)
                         );
                         simEntity.Bounds.Value = polygon;
                     }
                 }
                 simEntity.Components.Add(simCmp);
             }
         }
         Simulation.Entities.Add(simEntity);
         entity.SendMessage("SetIsCurrentTeam", Instance.CurrentPlayer == entity.Player);
     }
     Simulation.Begin();
     ServerSimulation = new Simulation.SimWorld();
     ServerSimulation.CloneFrom(Simulation);
 }
 public void Unbind()
 {
     Simulation.OnDead -= Simulation_OnDead;
     Simulation = null;
 }
 public void Bind(Simulation.SimEntity simulation)
 {
     if (Simulation != null) Unbind();
     Simulation = simulation;
     Simulation.OnDead += Simulation_OnDead;
 }