| using System; |
| using Unity.MLAgents.Actuators; |
| using UnityEngine; |
|
|
| namespace Unity.MLAgentsExamples |
| { |
| |
| |
| |
| |
| public class BasicActuatorComponent : ActuatorComponent |
| { |
| public BasicController basicController; |
| ActionSpec m_ActionSpec = ActionSpec.MakeDiscrete(3); |
|
|
| |
| |
| |
| |
| public override IActuator[] CreateActuators() |
| { |
| return new IActuator[] { new BasicActuator(basicController) }; |
| } |
|
|
| public override ActionSpec ActionSpec |
| { |
| get { return m_ActionSpec; } |
| } |
| } |
|
|
| |
| |
| |
| 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 Heuristic(in ActionBuffers actionBuffersOut) |
| { |
| var direction = Input.GetAxis("Horizontal"); |
| var discreteActions = actionBuffersOut.DiscreteActions; |
| if (Mathf.Approximately(direction, 0.0f)) |
| { |
| discreteActions[0] = 0; |
| return; |
| } |
| var sign = Math.Sign(direction); |
| discreteActions[0] = sign < 0 ? 1 : 2; |
| } |
|
|
| public void WriteDiscreteActionMask(IDiscreteActionMask actionMask) |
| { |
|
|
| } |
|
|
| } |
| } |
|
|