mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 19:34:47 +00:00
72 lines
3.0 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|