File size: 2,526 Bytes
05c9ac2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
using System;
using Unity.MLAgents.Actuators;
using UnityEngine;
namespace Unity.MLAgentsExamples
{
/// <summary>
/// A simple example of a ActuatorComponent.
/// This should be added to the same GameObject as the BasicController
/// </summary>
public class BasicActuatorComponent : ActuatorComponent
{
public BasicController basicController;
ActionSpec m_ActionSpec = ActionSpec.MakeDiscrete(3);
/// <summary>
/// Creates a BasicActuator.
/// </summary>
/// <returns></returns>
public override IActuator[] CreateActuators()
{
return new IActuator[] { new BasicActuator(basicController) };
}
public override ActionSpec ActionSpec
{
get { return m_ActionSpec; }
}
}
/// <summary>
/// Simple actuator that converts the action into a {-1, 0, 1} direction
/// </summary>
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; }
}
/// <inheritdoc/>
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)
{
}
}
}
|