using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.MLAgents; using Unity.MLAgents.Sensors; using Unity.MLAgents.Actuators; public class RollerAgent : Agent { private Rigidbody rBody; public Transform target; // Start is called before the first frame update void Start() { rBody = GetComponent(); } public override void OnEpisodeBegin() { if (this.transform.localPosition.y < 0) { this.rBody.velocity = Vector3.zero; this.rBody.angularVelocity = Vector3.zero; this.transform.localPosition = new Vector3(0, 0.5f, 0); } target.localPosition = new Vector3(Random.Range(-4f, 4f), 0.5f, Random.Range(-4f, 4f)); } public override void CollectObservations(VectorSensor sensor) { sensor.AddObservation(target.localPosition); sensor.AddObservation(this.transform.localPosition); sensor.AddObservation(rBody.velocity.x); sensor.AddObservation(rBody.velocity.z); } public float forceMult = 10f; public override void OnActionReceived(ActionBuffers actions) { float x = actions.ContinuousActions[0]; float z = actions.ContinuousActions[1]; rBody.AddForce(new Vector3(x, 0, z) * forceMult); float dist = Vector3.Distance(this.transform.localPosition, target.localPosition); if (dist < 1.42f) { SetReward(1.0f); EndEpisode(); } else if (this.transform.localPosition.y < 0) { EndEpisode(); } } public override void Heuristic(in ActionBuffers actionsOut) { var continuousActionsOut = actionsOut.ContinuousActions; continuousActionsOut[0] = Input.GetAxis("Horizontal"); continuousActionsOut[1] = Input.GetAxis("Vertical"); } }