|
|
|
using UnityEngine; |
|
using Unity.MLAgents; |
|
using Unity.MLAgents.Actuators; |
|
|
|
public class PushAgentCollab : Agent |
|
{ |
|
|
|
private PushBlockSettings m_PushBlockSettings; |
|
private Rigidbody m_AgentRb; |
|
|
|
protected override void Awake() |
|
{ |
|
base.Awake(); |
|
m_PushBlockSettings = FindObjectOfType<PushBlockSettings>(); |
|
} |
|
|
|
public override void Initialize() |
|
{ |
|
|
|
m_AgentRb = GetComponent<Rigidbody>(); |
|
} |
|
|
|
|
|
|
|
|
|
public void MoveAgent(ActionSegment<int> act) |
|
{ |
|
var dirToGo = Vector3.zero; |
|
var rotateDir = Vector3.zero; |
|
|
|
var action = act[0]; |
|
|
|
switch (action) |
|
{ |
|
case 1: |
|
dirToGo = transform.forward * 1f; |
|
break; |
|
case 2: |
|
dirToGo = transform.forward * -1f; |
|
break; |
|
case 3: |
|
rotateDir = transform.up * 1f; |
|
break; |
|
case 4: |
|
rotateDir = transform.up * -1f; |
|
break; |
|
case 5: |
|
dirToGo = transform.right * -0.75f; |
|
break; |
|
case 6: |
|
dirToGo = transform.right * 0.75f; |
|
break; |
|
} |
|
transform.Rotate(rotateDir, Time.fixedDeltaTime * 200f); |
|
m_AgentRb.AddForce(dirToGo * m_PushBlockSettings.agentRunSpeed, |
|
ForceMode.VelocityChange); |
|
} |
|
|
|
|
|
|
|
|
|
public override void OnActionReceived(ActionBuffers actionBuffers) |
|
|
|
{ |
|
|
|
MoveAgent(actionBuffers.DiscreteActions); |
|
} |
|
|
|
public override void Heuristic(in ActionBuffers actionsOut) |
|
{ |
|
var discreteActionsOut = actionsOut.DiscreteActions; |
|
if (Input.GetKey(KeyCode.D)) |
|
{ |
|
discreteActionsOut[0] = 3; |
|
} |
|
else if (Input.GetKey(KeyCode.W)) |
|
{ |
|
discreteActionsOut[0] = 1; |
|
} |
|
else if (Input.GetKey(KeyCode.A)) |
|
{ |
|
discreteActionsOut[0] = 4; |
|
} |
|
else if (Input.GetKey(KeyCode.S)) |
|
{ |
|
discreteActionsOut[0] = 2; |
|
} |
|
} |
|
} |
|
|