Repository URL to install this package:
|
Version:
1.3.2 ▾
|
using System;
using Fluctio.FluctioSim.Common.Configuration;
using Fluctio.FluctioSim.Utils.General;
using Unity.MLAgents.Actuators;
using UnityEngine;
namespace Fluctio.FluctioSim.Core.Components.MachineLearning.Actuating
{
[AddComponentMenu(Config.PrefixedName+"/Machine Learning/Actuating/Direct Control", Config.ComponentMenuOrder + 500)]
public class DirectControl : Control
{
#region Properties in GUI
[SerializeField] protected ManualInputAxis inputAxis = ManualInputAxis.None;
[SerializeField, Tooltip("Used for deterministic sorting and for identifying")] protected string actionName = "";
#endregion
#region Components setup
[SerializeField, HideInInspector] protected GameObject controlObject;
[SerializeField, HideInInspector] protected ProxyMlActuatorComponent mlagentsActuator;
protected override void InitializeOnce()
{
base.InitializeOnce();
controlObject = CreateInternalObject("Control");
mlagentsActuator = CreateInternalComponent<ProxyMlActuatorComponent>(controlObject);
mlagentsActuator.originalControl = this;
}
public override void InitializePrefab()
{
if (actionName == "")
{
actionName = NameGenerator.GenerateName();
}
}
#endregion
#region Actions
private ActionBuffers _actionBuffers;
public override ActionBuffers GetActions()
{
return _actionBuffers;
}
public virtual void OnActionReceived(in ActionBuffers actionBuffers)
{
_actionBuffers = actionBuffers;
}
#endregion
#region Heuristics
public virtual bool IsHeuristicsEnabled => inputAxis != ManualInputAxis.None;
protected float GetManualValue()
{
var axisName = Enum.GetName(typeof(ManualInputAxis), inputAxis);
var axisValue = Input.GetAxis(axisName);
return axisValue;
}
public virtual void Heuristic(in ActionBuffers actionBuffers)
{
var axisValue = GetManualValue();
actionBuffers.SetOneContinuous(axisValue);
}
#endregion
#region Other definitions
public virtual string ActuatorName => actionName;
public virtual ActionSpec ActionSpec => ActionSpec.MakeContinuous(1);
public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) {}
public virtual void ResetData() {}
#endregion
}
public enum ManualInputAxis
{
None,
Horizontal,
Vertical,
}
}