using System; using UnityEngine; namespace HPJ.Presentation.Agents { /// /// A example ground cast that connects a agent to the ground /// public class AgentGroundCast : MonoBehaviour { [SerializeField] private LayerMask _groundLayers; [SerializeField] private Transform _raycastSpot; [SerializeField] private float _rayCastDistance; public float RayCastDistance { get { return _rayCastDistance; } set { _rayCastDistance = value; } } [SerializeField] private float _rayCastElevatedDistance; public float RayCastElevatedDistance { get { return _rayCastElevatedDistance; } set { _rayCastElevatedDistance = value; } } [SerializeField] [Range(1, 10)] private int _rayCastEveryXFrames = 3; public int RayCastEveryXFrames { get { return _rayCastEveryXFrames; } set { _rayCastEveryXFrames = value; } } [SerializeField] private Transform _effectTransform; [SerializeField] private float _floatAmount; public float FloatAmount { get { return _floatAmount; } set { _floatAmount = value; } } [SerializeField] private Vector3 _raycastDirection = Vector3.down; public Vector3 RaycastDirection { get { return _raycastDirection; } set { _raycastDirection = value; } } [SerializeField] private bool AttemptTeleportUpOnFail = false; private RaycastHit _rayHit; private int _physicsCheckCounter = 0; // Update is called once per frame public void PhysicsCheck() { _physicsCheckCounter++; if (_physicsCheckCounter >= _rayCastEveryXFrames) { _physicsCheckCounter = 0; if (Physics.Raycast(_raycastSpot.position - _raycastDirection * _rayCastElevatedDistance, _raycastDirection, out _rayHit, _rayCastDistance + _rayCastElevatedDistance, _groundLayers)) { //Debug.Log("Move"); _effectTransform.transform.position = _rayHit.point - FloatAmount * _raycastDirection; } else if (Physics.Raycast(transform.position - _raycastDirection * _rayCastElevatedDistance, _raycastDirection, out _rayHit, _rayCastDistance + _rayCastElevatedDistance, _groundLayers)) { //Debug.Log("Move 2"); _effectTransform.transform.position = _rayHit.point - FloatAmount * _raycastDirection; } else if (AttemptTeleportUpOnFail) { TeleportUp(); } } } public void TeleportUp() { if (Physics.Raycast(_raycastSpot.position - _raycastDirection * 30, _raycastDirection, out _rayHit, _rayCastDistance * 60, _groundLayers)) { //Debug.Log("Teleport"); _effectTransform.transform.position = _rayHit.point - FloatAmount * _raycastDirection; } } } }