PC-20230316NUNE\Administrator 2b467e56ad no message
2024-02-20 18:39:12 +08:00

72 lines
3.0 KiB
C#

using System;
using UnityEngine;
namespace HPJ.Presentation.Agents
{
/// <summary>
/// A example ground cast that connects a agent to the ground
/// </summary>
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;
}
}
}
}