using UnityEngine; using Unity.MLAgents.Sensors; namespace Unity.MLAgents.Extensions.Sensors { /// /// Editor component that creates a PhysicsBodySensor for the Agent. /// public class RigidBodySensorComponent : SensorComponent { /// /// The root Rigidbody of the system. /// public Rigidbody RootBody; /// /// Settings defining what types of observations will be generated. /// [SerializeField] public PhysicsSensorSettings Settings = PhysicsSensorSettings.Default(); /// /// Optional sensor name. This must be unique for each Agent. /// public string sensorName; /// /// Creates a PhysicsBodySensor. /// /// public override ISensor CreateSensor() { return new PhysicsBodySensor(RootBody, gameObject, Settings, sensorName); } /// public override int[] GetObservationShape() { if (RootBody == null) { return new[] { 0 }; } // TODO static method in PhysicsBodySensor? // TODO only update PoseExtractor when body changes? var poseExtractor = new RigidBodyPoseExtractor(RootBody, gameObject); var numTransformObservations = Settings.TransformSize(poseExtractor.NumPoses); return new[] { numTransformObservations }; } } }