Repository URL to install this package:
Version:
1.1.0 ▾
|
using System;
using System.Collections.Generic;
using Fluctio.FluctioSim.Common.Configuration;
using Fluctio.FluctioSim.Utils.General;
using Unity.MLAgents.Actuators;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Fluctio.FluctioSim.Core.Components.MachineLearning.Actuating
{
[AddComponentMenu(Config.PrefixedName+"/Machine Learning/Actuating/Direct Control", Config.ComponentMenuOrder + 40)]
public class DirectControl : Control
{
[SerializeField] protected ManualInputAxis inputAxis = ManualInputAxis.None;
#region Components setup
[SerializeField, HideInInspector] protected GameObject controlObject;
[SerializeField, HideInInspector] protected ProxyMlActuatorComponent mlagentsActuator;
[SerializeField, HideInInspector] protected string actuatorName = "";
protected override void InitializeOnce()
{
base.InitializeOnce();
controlObject = new GameObject("Control");
controlObject.transform.SetParent(transform);
mlagentsActuator = controlObject.AddComponent<ProxyMlActuatorComponent>();
mlagentsActuator.originalControl = this;
}
public override void InitializePrefab()
{
if (actuatorName == "")
{
actuatorName = NameGenerator.GenerateName();
}
}
protected override IEnumerable<GameObject> GetInternalObjects() => new[] {controlObject};
protected override IEnumerable<Object> GetCreatedInternals() => new[] {controlObject};
#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;
public virtual void Heuristic(in ActionBuffers actionBuffers) {
var axisName = Enum.GetName(typeof(ManualInputAxis), inputAxis);
var continuousActions = actionBuffers.ContinuousActions;
continuousActions[0] = Input.GetAxis(axisName);
}
#endregion
#region Other definitions
public virtual string ActuatorName => actuatorName;
public virtual ActionSpec ActionSpec => ActionSpec.MakeContinuous(1);
public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) {}
public virtual void ResetData() {}
#endregion
}
public enum ManualInputAxis
{
None,
Horizontal,
Vertical,
}
}