Exemplo n.º 1
0
 /// <summary>
 /// Add the telemetry measurements to the sensor data.
 /// </summary>
 /// <param name="sensor">The telemetry sensor details.</param>
 /// <param name="sensorData">The target sensor data to write to.</param>
 /// <param name="offset">The offeset to write to.</param>
 /// <returns>The number of data points written.</returns>
 private int AddTelemetry(TelemetrySensor sensor, SensorData sensorData, int offset)
 {
     if (sensor.GetTelemetry != null)
     {
         double[] telemetry = sensor.GetTelemetry();
         telemetry.CopyTo(sensorData.Data, offset);
         return(telemetry.Length);
     }
     else
     {
         return(0);
     }
 }
    void Start()
    {
        // Distance Sensors
        for (int i = 0; i < DistanceSensors.Length; ++i)
        {
            DistanceSensor sensor = DistanceSensors[i];
            DistanceSensors[i].LayerMask = LayerMask.GetMask(DistanceSensors[i].Layers);
            Quaternion rot = Quaternion.AngleAxis(DistanceSensors[i].Angle, Vector3.up);
            DistanceSensors[i].Direction = (rot * Vector3.forward).normalized;
        }

        // Telemetry Sensors
        TelemetrySensor teleSense = new TelemetrySensor()
        {
            GetTelemetry      = this.getTelemetry,
            GetTelemetryCount = this.getTelemetryCount
        };

        // Sensor Component
        Sensors sensors = GetComponent <Sensors>();

        sensors.DistanceSensors = DistanceSensors;
        sensors.TelemetrySensor = teleSense;

        // Sensor Data Component
        SensorData sensorData = GetComponent <SensorData>();

        sensorData.Data = new double[
            sensors.TelemetrySensor.GetTelemetryCount() +
            (sensors.DistanceSensors.Length * SensorSystem.DATA_POINTS_PER_DISTANCE_SENSOR)
                          ];

        for (int i = 0; i < sensorData.Data.Length; ++i)
        {
            sensorData.Data[i] = 0;
        }

        // Initialize the layers
        Net net = GetComponent <Net>();

        if (InitalNet.LayerSizes != null)
        {
            // Debug.Log("INITIALIZING WITH NET");
            net.Data = InitalNet;
        }
        else
        {
            net.Data               = new NetData();
            net.Data.LayerSizes    = new int[HiddenLayerSizes.Length + 2];
            net.Data.LayerSizes[0] = sensorData.Data.Length;
            HiddenLayerSizes.CopyTo(net.Data.LayerSizes, 1);
            net.Data.LayerSizes[HiddenLayerSizes.Length + 1] = 2; // MotionInputs
            net.Data.Weights = new double[netSize(net.Data)];
            Neural.Mutators.SelfMutate(new NetData[] { net.Data }, new Neural.Options()
            {
                { "clone", false },
                { "mutationProbability", 1 },
                { "mutationFactor", 1 },
                { "mutationRange", 10000 },
            });
        }

        // Mettabolism
        Metabolism metabolism = new Metabolism
        {
            HealthDecayRate  = 1,
            MealtimeInterval = InitialMealtimeInterval
        };

        gameObjectEntity.EntityManager.AddComponentData <Metabolism>(gameObjectEntity.Entity, metabolism);

        // Stats
        Stats stats = new Stats
        {
            Tag            = gameObject.tag.GetHashCode(),
            Health         = InitialHealth,
            Age            = 0,
            Generation     = 0,
            Aggression     = InitialAggression,
            Nutrition      = InitialNutrition,
            LastMealTime   = DateTime.Now.Ticks,
            MatingAge      = MatingAge,
            MatingCost     = MatingCost,
            MatingCoolDown = MatingCoolDown
        };

        gameObjectEntity.EntityManager.AddComponentData <Stats>(gameObjectEntity.Entity, stats);
    }