|
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) |
|
{ |
|
|
|
} |
|
|
|
} |
|
} |
|
|