using UnityEngine; using UnityEngine.Serialization; namespace MLAgents.Sensors { /// /// Component that wraps a . /// [AddComponentMenu("ML Agents/Render Texture Sensor", (int)MenuGroup.Sensors)] public class RenderTextureSensorComponent : SensorComponent { RenderTextureSensor m_Sensor; /// /// The instance that the associated /// wraps. /// [HideInInspector, SerializeField, FormerlySerializedAs("renderTexture")] RenderTexture m_RenderTexture; /// /// Stores the associated with this sensor. /// public RenderTexture RenderTexture { get { return m_RenderTexture; } set { m_RenderTexture = value; } } [HideInInspector, SerializeField, FormerlySerializedAs("sensorName")] string m_SensorName = "RenderTextureSensor"; /// /// Name of the generated . /// Note that changing this at runtime does not affect how the Agent sorts the sensors. /// public string SensorName { get { return m_SensorName; } set { m_SensorName = value; } } [HideInInspector, SerializeField, FormerlySerializedAs("grayscale")] bool m_Grayscale; /// /// Whether the RenderTexture observation should be converted to grayscale or not. /// Note that changing this after the sensor is created has no effect. /// public bool Grayscale { get { return m_Grayscale; } set { m_Grayscale = value; } } [HideInInspector, SerializeField, FormerlySerializedAs("compression")] SensorCompressionType m_Compression = SensorCompressionType.PNG; /// /// Compression type for the render texture observation. /// public SensorCompressionType CompressionType { get { return m_Compression; } set { m_Compression = value; UpdateSensor(); } } /// public override ISensor CreateSensor() { m_Sensor = new RenderTextureSensor(RenderTexture, Grayscale, SensorName, m_Compression); return m_Sensor; } /// public override int[] GetObservationShape() { var width = RenderTexture != null ? RenderTexture.width : 0; var height = RenderTexture != null ? RenderTexture.height : 0; return new[] { height, width, Grayscale ? 1 : 3 }; } /// /// Update fields that are safe to change on the Sensor at runtime. /// internal void UpdateSensor() { if (m_Sensor != null) { m_Sensor.CompressionType = m_Compression; } } } }