using UnityEngine; namespace Unheimlich.Utility { public static class RaycastHelper { private static readonly Vector3 ViewportCenter = new Vector3(0.5f, 0.5f, 0f); public static bool RaycastFromCameraCenter(Camera camera, float maxDistance, LayerMask layerMask, out RaycastHit hit) { if (camera == null) { hit = default; return false; } Ray ray = camera.ViewportPointToRay(ViewportCenter); return Physics.Raycast(ray, out hit, maxDistance, layerMask); } public static bool RaycastFromCameraCenter(Camera camera, float maxDistance, LayerMask layerMask, out T component) where T : Component { component = null; if (RaycastFromCameraCenter(camera, maxDistance, layerMask, out RaycastHit hit)) { component = hit.collider.GetComponent(); return component != null; } return false; } public static bool ThrottledRaycast(ref float timer, float interval, Camera camera, float maxDistance, LayerMask layerMask, out RaycastHit hit) { timer += Time.deltaTime; if (timer >= interval) { timer = 0f; return RaycastFromCameraCenter(camera, maxDistance, layerMask, out hit); } hit = default; return false; } public static bool ThrottledRaycastComponent(ref float timer, float interval, Camera camera, float maxDistance, LayerMask layerMask, out T component) where T : Component { timer += Time.deltaTime; if (timer >= interval) { timer = 0f; return RaycastFromCameraCenter(camera, maxDistance, layerMask, out component); } component = null; return false; } } }