using System.Collections.Generic; using UnityEngine; public class HideWall : MonoBehaviour { public static HideWall instance; [SerializeField] private GameObject originalTarget; public GameObject target; [SerializeField] private GameObject origin; [Range(1f, 10f)] public float hideFadeSpeed; [Range(1f, 10f)] public float showFadeSpeed; public float sphereRadius; float maxSphereRayDistance; private List prevHitObjects = new List(); private void Start() { if (instance == null) instance = this; } void Update() { if (target == null) target = originalTarget; maxSphereRayDistance = Vector3.Distance(origin.transform.position, target.transform.position) - (sphereRadius); Vector3 direction = (target.transform.position - origin.transform.position).normalized; RaycastHit[] hits = Physics.SphereCastAll(origin.transform.position, sphereRadius, direction, maxSphereRayDistance); List hitObjectsThisFrame = new List(); for (int i = 0; i < hits.Length; i++) { //print(hits[i].collider.gameObject.name); if (hits[i].collider != null) { var hitGameObject = hits[i].collider.gameObject; hitObjectsThisFrame.Add(hitGameObject); var wallOpacity = hitGameObject.GetComponent(); if (wallOpacity != null && !prevHitObjects.Contains(hitGameObject)) { wallOpacity.HideWall(hideFadeSpeed); } } } foreach (var prevHitObject in prevHitObjects) { if (prevHitObject == null) break; if (!hitObjectsThisFrame.Contains(prevHitObject)) { var wallOpacity = prevHitObject.GetComponent(); if (wallOpacity != null) { wallOpacity.ShowWall(showFadeSpeed); } } } prevHitObjects = hitObjectsThisFrame; } private void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawWireSphere(origin.transform.position, sphereRadius); maxSphereRayDistance = Vector3.Distance(origin.transform.position, target.transform.position) - (sphereRadius); Vector3 direction = (target.transform.position - origin.transform.position).normalized; Gizmos.DrawRay(origin.transform.position, direction * maxSphereRayDistance); } }