146 lines
4.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
|