您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
99 行
2.5 KiB
99 行
2.5 KiB
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)
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
}
|