using InfallibleCode; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class PlayerOverlapSphereDetectorManager : MonoBehaviour { private Camera _camera; [HideInInspector] public RaycastHit hit; [Header("Interact")] [SerializeField] private float _visibilityRadious = 4; public LayerMask obstacleLayer; // Set this to the layer where obstacles reside [SerializeField] private GameObject _visibilityUIPrefab; private static PlayerOverlapSphereDetectorManager _instance; public static PlayerOverlapSphereDetectorManager GetInstance() { return _instance; } private void Awake() { if (!_instance) { _instance = this; } } private void Start() { _camera = PlayerManager.GetInstance().PlayerMainCamera.GetComponent(); } private void Update() { CanSeeItem(); } public void CanSeeItem() { // Adjust the position and radius as needed Collider[] colliders = Physics.OverlapSphere(_camera.transform.position, _visibilityRadious); foreach (Collider collider in colliders) { ItemVisibilityIcon visibilityIcon = null; // Check if the pickup has the ItemVisibilityIcon component if (TryGetVisibilityIconComponent(collider, out visibilityIcon)) { // Check if there is a clear line of sight if (IsClearLineOfSight(collider.transform.position, collider)) { // Instantiate the prefab if it doesn't exist if (visibilityIcon.VisibilityPrefab == null) { visibilityIcon.VisibilityPrefab = Instantiate(_visibilityUIPrefab, collider.transform.position, Quaternion.identity, visibilityIcon.transform); } } else { if (visibilityIcon.VisibilityPrefab != null) { // Destroy the prefab if there is an obstacle in the way print("Destroy Visibility icon"); //Destroy(visibilityIcon.VisibilityPrefab); StartCoroutine(DestroyAfterSeconds(visibilityIcon.VisibilityPrefab, visibilityIcon)); //visibilityIcon.VisibilityPrefab = null; } } } } // Check for pickups that are no longer in the overlap sphere CheckForOutOfRangePickups(colliders); } private bool TryGetVisibilityIconComponent(Collider collider, out ItemVisibilityIcon visibilityIcon) { visibilityIcon = collider.GetComponent(); return visibilityIcon != null; } private void CheckForOutOfRangePickups(Collider[] colliders) { GameObject[] visiblePrefabs = GameObject.FindGameObjectsWithTag("VisibilityPrefab"); // Assuming you've tagged the instantiated prefabs foreach (GameObject prefab in visiblePrefabs) { bool isStillVisible = false; foreach (Collider collider in colliders) { if (collider.TryGetComponent(out ItemVisibilityIcon visibilityIcon) && visibilityIcon.VisibilityPrefab == prefab) { isStillVisible = true; break; } } // If the prefab is not associated with any collider, destroy it if (!isStillVisible) { //Destroy(prefab); StartCoroutine(DestroyAfterSecondsForCheckForOutOfRangePickups(prefab)); } } } IEnumerator DestroyAfterSeconds(GameObject itemVisibilityGO, ItemVisibilityIcon itemVisibilityIcon) { itemVisibilityIcon.VisibilityPrefab.GetComponent().SetBool("FadeIn", false); yield return new WaitForSeconds(0.15f); Destroy(itemVisibilityGO); itemVisibilityIcon.VisibilityPrefab = null; } IEnumerator DestroyAfterSecondsForCheckForOutOfRangePickups(GameObject itemVisibilityGO) { itemVisibilityGO.GetComponent().SetBool("FadeIn", false); yield return new WaitForSeconds(0.15f); Destroy(itemVisibilityGO); } private bool IsClearLineOfSight(Vector3 targetPosition, Collider itemCollider) { //RaycastHit hit; Vector3 dirToTarget = (targetPosition - _camera.transform.position).normalized; float distToTarget = Vector3.Distance(_camera.transform.position, targetPosition); if (!Physics.Raycast(_camera.transform.position, dirToTarget, distToTarget, obstacleLayer, QueryTriggerInteraction.Ignore)) { return true; } else { return false; } } }