Files
HauntedBloodlines/Assets/Scripts/Managers/PlayerOverlapSphereDetectorManager.cs
2025-05-29 22:31:40 +03:00

146 lines
4.9 KiB
C#

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<Camera>();
}
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<ItemVisibilityIcon>();
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<ItemVisibilityIcon>(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<Animator>().SetBool("FadeIn", false);
yield return new WaitForSeconds(0.15f);
Destroy(itemVisibilityGO);
itemVisibilityIcon.VisibilityPrefab = null;
}
IEnumerator DestroyAfterSecondsForCheckForOutOfRangePickups(GameObject itemVisibilityGO)
{
itemVisibilityGO.GetComponent<Animator>().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;
}
}
}