コード例 #1
0
    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();
        }
    }
コード例 #2
0
    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();
        }
    }