using System; using Unity.MLAgents.Actuators; namespace Unity.MLAgentsExamples { /// /// A simple example of a ActuatorComponent. /// This should be added to the same GameObject as the BasicController /// public class BasicActuatorComponent : ActuatorComponent { public BasicController basicController; ActionSpec m_ActionSpec = ActionSpec.MakeDiscrete(3); /// /// Creates a BasicActuator. /// /// public override IActuator CreateActuator() { return new BasicActuator(basicController); } public override ActionSpec ActionSpec { get { return m_ActionSpec; } } } /// /// Simple actuator that converts the action into a {-1, 0, 1} direction /// public class BasicActuator : IActuator { public BasicController basicController; ActionSpec m_ActionSpec; public BasicActuator(BasicController controller) { basicController = controller; m_ActionSpec = ActionSpec.MakeDiscrete(3); } public ActionSpec ActionSpec { get { return m_ActionSpec; } } /// public String Name { get { return "Basic"; } } public void ResetData() { } public void OnActionReceived(ActionBuffers actionBuffers) { var movement = actionBuffers.DiscreteActions[0]; var direction = 0; switch (movement) { case 1: direction = -1; break; case 2: direction = 1; break; } basicController.MoveDirection(direction); } public void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } } }