|
using System; |
|
using UnityEngine; |
|
using UnityEngine.Serialization; |
|
|
|
namespace Unity.MLAgents.Sensors |
|
{ |
|
|
|
|
|
|
|
[AddComponentMenu("ML Agents/Camera Sensor", (int)MenuGroup.Sensors)] |
|
public class CameraSensorComponent : SensorComponent, IDisposable |
|
{ |
|
[HideInInspector, SerializeField, FormerlySerializedAs("camera")] |
|
Camera m_Camera; |
|
|
|
CameraSensor m_Sensor; |
|
|
|
|
|
|
|
|
|
public Camera Camera |
|
{ |
|
get { return m_Camera; } |
|
set { m_Camera = value; UpdateSensor(); } |
|
} |
|
|
|
[HideInInspector, SerializeField, FormerlySerializedAs("sensorName")] |
|
string m_SensorName = "CameraSensor"; |
|
|
|
|
|
|
|
|
|
|
|
public string SensorName |
|
{ |
|
get { return m_SensorName; } |
|
set { m_SensorName = value; } |
|
} |
|
|
|
[HideInInspector, SerializeField, FormerlySerializedAs("width")] |
|
int m_Width = 84; |
|
|
|
|
|
|
|
|
|
|
|
public int Width |
|
{ |
|
get { return m_Width; } |
|
set { m_Width = value; } |
|
} |
|
|
|
[HideInInspector, SerializeField, FormerlySerializedAs("height")] |
|
int m_Height = 84; |
|
|
|
|
|
|
|
|
|
|
|
public int Height |
|
{ |
|
get { return m_Height; } |
|
set { m_Height = value; } |
|
} |
|
|
|
[HideInInspector, SerializeField, FormerlySerializedAs("grayscale")] |
|
bool m_Grayscale; |
|
|
|
|
|
|
|
|
|
|
|
public bool Grayscale |
|
{ |
|
get { return m_Grayscale; } |
|
set { m_Grayscale = value; } |
|
} |
|
|
|
[HideInInspector, SerializeField] |
|
ObservationType m_ObservationType; |
|
|
|
|
|
|
|
|
|
public ObservationType ObservationType |
|
{ |
|
get { return m_ObservationType; } |
|
set { m_ObservationType = value; UpdateSensor(); } |
|
} |
|
|
|
[HideInInspector, SerializeField] |
|
bool m_RuntimeCameraEnable; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public bool RuntimeCameraEnable |
|
{ |
|
get { return m_RuntimeCameraEnable; } |
|
set { m_RuntimeCameraEnable = value; UpdateSensor(); } |
|
} |
|
|
|
[HideInInspector, SerializeField] |
|
[Range(1, 50)] |
|
[Tooltip("Number of camera frames that will be stacked before being fed to the neural network.")] |
|
int m_ObservationStacks = 1; |
|
|
|
[HideInInspector, SerializeField, FormerlySerializedAs("compression")] |
|
SensorCompressionType m_Compression = SensorCompressionType.PNG; |
|
|
|
|
|
|
|
|
|
public SensorCompressionType CompressionType |
|
{ |
|
get { return m_Compression; } |
|
set { m_Compression = value; UpdateSensor(); } |
|
} |
|
|
|
|
|
|
|
|
|
|
|
public int ObservationStacks |
|
{ |
|
get { return m_ObservationStacks; } |
|
set { m_ObservationStacks = value; } |
|
} |
|
|
|
void Start() |
|
{ |
|
UpdateSensor(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
public override ISensor[] CreateSensors() |
|
{ |
|
Dispose(); |
|
m_Sensor = new CameraSensor(m_Camera, m_Width, m_Height, Grayscale, m_SensorName, m_Compression, m_ObservationType); |
|
|
|
if (ObservationStacks != 1) |
|
{ |
|
return new ISensor[] { new StackingSensor(m_Sensor, ObservationStacks) }; |
|
} |
|
return new ISensor[] { m_Sensor }; |
|
} |
|
|
|
|
|
|
|
|
|
internal void UpdateSensor() |
|
{ |
|
if (m_Sensor != null) |
|
{ |
|
m_Sensor.Camera = m_Camera; |
|
m_Sensor.CompressionType = m_Compression; |
|
m_Sensor.Camera.enabled = m_RuntimeCameraEnable; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
public void Dispose() |
|
{ |
|
if (!ReferenceEquals(m_Sensor, null)) |
|
{ |
|
m_Sensor.Dispose(); |
|
m_Sensor = null; |
|
} |
|
} |
|
} |
|
} |
|
|