Files
JJBB/Assets/Project/Script/Common/Utilities/RaycastDisplayer.cs

74 lines
2.2 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using UnityEngine;
public class RaycastDisplayer : MonoBehaviour
{
public static void DebugPhysicsRaycast(Ray ray, float distance, int layerMask)
{
#if UNITY_EDITOR
distance = Mathf.Max(distance, 1000f);
GetDisplayer().PhysicsRaycast(ray.origin, ray.direction.normalized * distance, layerMask);
#else
Module.Log.LogModule.ErrorLog("不允许在发布游戏中使用射线Debug用的RaycastDisplayer");
#endif
}
public static void DebugNavMeshRaycast(Ray ray, float distance, int areaMask)
{
#if UNITY_EDITOR
distance = Mathf.Max(distance, 1000f);
GetDisplayer().NavMeshRaycast(ray.origin, ray.direction.normalized * distance, areaMask);
#else
Module.Log.LogModule.ErrorLog("不允许在发布游戏中使用射线Debug用的RaycastDisplayer");
#endif
}
#if UNITY_EDITOR
private static RaycastDisplayer _displayer;
private Vector3 _start;
private Vector3 _end;
private Vector3? _hitPoint;
private static RaycastDisplayer GetDisplayer()
{
if (_displayer == null)
{
var displayObj = new GameObject("RaycastDisplayer");
_displayer = displayObj.EnsureComponent<RaycastDisplayer>();
}
return _displayer;
}
private void PhysicsRaycast(Vector3 start, Vector3 end, int layerMask)
{
_start = start;
_end = end;
RaycastHit hit;
if (Physics.Raycast(start, end - start, out hit, Vector3.Distance(start, end), layerMask))
_hitPoint = hit.point;
else
_hitPoint = null;
}
private void NavMeshRaycast(Vector3 start, Vector3 end, int areaMask)
{
_start = start;
_end = end;
UnityEngine.AI.NavMeshHit hit;
if (UnityEngine.AI.NavMesh.Raycast(start, end, out hit, areaMask))
_hitPoint = hit.position;
else
_hitPoint = null;
}
private void OnDrawGizmos()
{
Gizmos.color = Color.blue;
Gizmos.DrawLine(_start, _end);
if (_hitPoint != null)
{
Gizmos.color = Color.red;
Gizmos.DrawSphere(_hitPoint.Value, 0.1f);
}
}
#endif
}