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; }