private void InstantiateSensors(SensorData[] sensors) { var parents = new Dictionary <string, GameObject>() { { string.Empty, gameObject }, }; var Controller = GetComponent <IAgentController>(); var requested = sensors.ToList(); var baseLink = transform.GetComponentInChildren <BaseLink>(); while (requested.Count > 0) { // remember how many are still looking to find their parent int requestedCount = requested.Count; for (int i = 0; i < requested.Count(); i++) { var item = requested[i]; string parentName = item.Parent != null ? item.Parent : string.Empty; if (!parents.ContainsKey(parentName)) { continue; } var parentObject = parents[parentName]; var name = item.Name; var type = item.Type; GameObject prefab = null; if (item.Plugin.AssetGuid == null) { prefab = Config.SensorPrefabs.FirstOrDefault(s => GetSensorType(s) == type).gameObject; } else if (Config.SensorTypeLookup.ContainsKey(item.Plugin.AssetGuid)) { prefab = Config.SensorTypeLookup[item.Plugin.AssetGuid]?.gameObject; } else { var dir = Path.Combine(Config.PersistentDataPath, "Sensors"); var vfs = VfsEntry.makeRoot(dir); Config.CheckDir(vfs.GetChild(item.Plugin.AssetGuid), Config.LoadSensorPlugin); if (Config.SensorTypeLookup.ContainsKey(item.Plugin.AssetGuid)) { prefab = Config.SensorTypeLookup[item.Plugin.AssetGuid]?.gameObject; } } if (prefab == null) { throw new Exception($"Issue loading sensor type {type} for gameobject {gameObject.name} check logs"); } var sensor = CreateSensor(gameObject, parentObject, prefab, item, baseLink); var sensorBase = sensor.GetComponent <SensorBase>(); sensorBase.Name = name; sensor.name = name; if (AgentBridgeClient != null) { sensor.GetComponent <SensorBase>().OnBridgeSetup(AgentBridgeClient.Bridge); } parents.Add(name, sensor); requested.RemoveAt(i); i--; var sensorInstanceController = new SensorInstanceController(item, sensorBase); if (SimulatorManager.InstanceAvailable) { SimulatorManager.Instance.Sensors.RegisterSensor(sensorBase); } sensorInstanceController.Enable(); Controller?.AgentSensors.Add(sensorBase); sensorsInstances.Add(name, sensorInstanceController); } // no sensors found their parent this round, they also won't find it next round if (requestedCount == requested.Count) { throw new Exception($"Failed to create {requested.Count} sensor(s), cannot determine parent-child relationship"); } SensorsChanged?.Invoke(); } }
private void InstantiateSensors(string sensors) { var available = Simulator.Web.Config.Sensors.ToDictionary(sensor => sensor.Name); var prefabs = Simulator.Web.Config.SensorPrefabs.ToDictionary(sensor => GetSensorType(sensor)); var parents = new Dictionary <string, GameObject>() { { string.Empty, gameObject }, }; var agentController = GetComponent <AgentController>(); var requested = JSONNode.Parse(sensors).Children.ToList(); while (requested.Count != 0) { int requestedCount = requested.Count; foreach (var parent in parents.Keys.ToArray()) { var parentObject = parents[parent]; for (int i = 0; i < requested.Count; i++) { var item = requested[i]; if (item["parent"].Value == parent) { var name = item["name"].Value; var type = item["type"].Value; SensorConfig config; if (!available.TryGetValue(type, out config)) { throw new Exception($"Unknown sensor type {type} for {gameObject.name} vehicle"); } var sensor = CreateSensor(gameObject, parentObject, prefabs[type].gameObject, item); var sensorBase = sensor.GetComponent <SensorBase>(); sensorBase.Name = name; sensor.name = name; SIM.LogSimulation(SIM.Simulation.SensorStart, name); if (AgentBridgeClient != null) { sensor.GetComponent <SensorBase>().OnBridgeSetup(AgentBridgeClient.Bridge); } parents.Add(name, sensor); requested.RemoveAt(i); i--; var sensorInstanceController = new SensorInstanceController(item, sensorBase); sensorInstanceController.Enable(); agentController.AgentSensors.Add(sensorBase); sensorsInstances.Add(name, sensorInstanceController); } } } if (requestedCount == requested.Count) { throw new Exception( $"Failed to create {requested.Count} sensor(s), cannot determine parent-child relationship"); } SensorsChanged?.Invoke(); } }