private static void AddVehicles(ref int currentEntityId, Dictionary <EntityId, Entity> snapshotEntities, ISnapshot snapshot) { var index = 0; for (var i = 0; i < snapshot.VehicleCount; i++) { var angle = 2 * Mathf.PI * i / snapshot.VehicleCount; var x = SimulationSettings.TrackRadius * Mathf.Cos(angle); var y = SimulationSettings.TrackRadius * Mathf.Sin(angle); var position = new Vector3(x, 0f, y); var quaternion = Quaternion.AngleAxis(-angle * 180 / Mathf.PI, Vector3.up); var data = new VehicleControlData(); data.maxSpeed = RandomRange(snapshot.MaxSpeed); data.maxAcceleration = RandomRange(snapshot.MaxAcceleration); data.responseScaling = RandomRange(snapshot.ResponseScaling); data.panicDistance = RandomRange(snapshot.PanicDistance); data.reactionTime = RandomRange(snapshot.ReactionTime); var sensorData = new SensorData(); sensorData.sensorRange = RandomRange(snapshot.SensorRange); data.colourRed = 1f; data.colourGreen = 1f; data.colourBlue = 1f; data.speed = 0f; data.desiredSpeed = data.maxSpeed; data.reactionBuffer = Bytes.FromBackingArray(new byte[data.reactionTime * sizeof(float)]); var id = currentEntityId; if (snapshot.SpecialVehicles.Any(v => v.Id == id)) { PopulateSpecial(ref data, ref sensorData, snapshot.SpecialVehicles.Single(v => v.Id == id)); index += 1; } else if (index < snapshot.SpecialVehicles.Count) { if (snapshot.SpecialVehicles[index].Id == null) { PopulateSpecial(ref data, ref sensorData, snapshot.SpecialVehicles[index]); } index += 1; } snapshotEntities.Add( new EntityId(currentEntityId++), EntityTemplateFactory.CreateVehicleTemplate(position, quaternion, data, sensorData)); } }