using System.Collections.Generic; using UnityEngine; namespace BlueWater { public class CharacterHighlighting : MonoBehaviour { [SerializeField] private LayerMask _obstacleLayer; [SerializeField, Range(1, 16)] private int _maxHitCount = 8; private Camera _mainCamera; private RaycastHit[] _raycastHits; private List _currentFadeables; private List _previousFadeables; private void Start() { _mainCamera = Camera.main; _raycastHits = new RaycastHit[_maxHitCount]; _currentFadeables = new List(_maxHitCount); _previousFadeables = new List(_maxHitCount); } private void Update() { _currentFadeables.Clear(); var cameraPosition = _mainCamera.transform.position; var direction = transform.position - cameraPosition; var distance = direction.magnitude; var size = Physics.RaycastNonAlloc(cameraPosition, direction, _raycastHits, distance, _obstacleLayer, QueryTriggerInteraction.Collide); for (var i = 0; i < size; i++) { var hitObject = _raycastHits[i].collider.GetComponentInChildren(); if (!hitObject || _currentFadeables.Contains(hitObject)) continue; if (hitObject.IsFadeable) { hitObject.SetTransparent(); _currentFadeables.Add(hitObject); } } foreach (var element in _previousFadeables) { if (_currentFadeables.Contains(element)) continue; element.RestoreOriginal(); } (_previousFadeables, _currentFadeables) = (_currentFadeables, _previousFadeables); } } }