ppo-Pyramids-Training / Project /Assets /ML-Agents /Examples /SharedAssets /Scripts /GroundContact.cs
| using UnityEngine; | |
| using Unity.MLAgents; | |
| namespace Unity.MLAgentsExamples | |
| { | |
| /// <summary> | |
| /// This class contains logic for locomotion agents with joints which might make contact with the ground. | |
| /// By attaching this as a component to those joints, their contact with the ground can be used as either | |
| /// an observation for that agent, and/or a means of punishing the agent for making undesirable contact. | |
| /// </summary> | |
| [] | |
| public class GroundContact : MonoBehaviour | |
| { | |
| [] public Agent agent; | |
| [] public bool agentDoneOnGroundContact; // Whether to reset agent on ground contact. | |
| public bool penalizeGroundContact; // Whether to penalize on contact. | |
| public float groundContactPenalty; // Penalty amount (ex: -1). | |
| public bool touchingGround; | |
| const string k_Ground = "ground"; // Tag of ground object. | |
| /// <summary> | |
| /// Check for collision with ground, and optionally penalize agent. | |
| /// </summary> | |
| void OnCollisionEnter(Collision col) | |
| { | |
| if (col.transform.CompareTag(k_Ground)) | |
| { | |
| touchingGround = true; | |
| if (penalizeGroundContact) | |
| { | |
| agent.SetReward(groundContactPenalty); | |
| } | |
| if (agentDoneOnGroundContact) | |
| { | |
| agent.EndEpisode(); | |
| } | |
| } | |
| } | |
| /// <summary> | |
| /// Check for end of ground collision and reset flag appropriately. | |
| /// </summary> | |
| void OnCollisionExit(Collision other) | |
| { | |
| if (other.transform.CompareTag(k_Ground)) | |
| { | |
| touchingGround = false; | |
| } | |
| } | |
| } | |
| } | |