using System.Collections; using System.Collections.Generic; using Unity.MLAgents; using Unity.MLAgentsExamples; using UnityEngine; using UnityEngine.Events; public class OnChairContact : MonoBehaviour { public UnityEvent m_CollisionEvent; public UnityEvent m_CollisionStayEvent; public UnityEvent m_CollisionExitEvent; public UnityEvent m_TriggerStayEvent; public UnityEvent m_TriggerExitEvent; public bool m_IsTouching; public bool m_IsAttached; public float m_TrayTimeout; private string m_Tag = "agent"; [SerializeField] public FixedJoint m_FixedJoint; void OnEnable() { m_IsTouching = false; m_IsAttached = false; } private void Start() { if (this.TryGetComponent(out FixedJoint component)) { m_FixedJoint = component; } else { m_FixedJoint = null; } } private void OnCollisionEnter(Collision col) { if (col.transform.CompareTag(m_Tag)) { if (col.gameObject.GetComponent().isFoot && m_FixedJoint && !m_IsAttached) { m_IsAttached = true; // Attach Joint Rigidbody rbFoot = col.gameObject.GetComponent(); Debug.Log($"Attached to {col.gameObject.name}"); m_FixedJoint.connectedBody = rbFoot; StartCoroutine(WaitToDetatch()); } m_IsTouching = true; m_CollisionEvent?.Invoke(); } } private void OnCollisionStay(Collision col) { if (col.transform.CompareTag(m_Tag)) { m_IsTouching = true; m_CollisionStayEvent?.Invoke(); } } private void OnCollisionExit(Collision other) { if (other.transform.CompareTag(m_Tag)) { m_IsTouching = false; m_CollisionExitEvent?.Invoke(); } } private void OnTriggerStay(Collider other) { if (other.transform.CompareTag(m_Tag)) { m_IsTouching = true; m_TriggerStayEvent?.Invoke(); } } private void OnTriggerExit(Collider other) { if (other.transform.CompareTag(m_Tag)) { m_IsTouching = false; m_TriggerExitEvent?.Invoke(); } } IEnumerator WaitToDetatch() { Debug.Log("Waiting for detatch"); yield return new WaitForSeconds(m_TrayTimeout); Destroy(m_FixedJoint); } }