using BlueWater.Interfaces; using UnityEngine; namespace BlueWater { public class SeeThrough : MonoBehaviour { [SerializeField] private LayerMask _maskLayer; [SerializeField] private float _size = 0.5f; private Camera _mainCamera; private Material _hitMaterialInstance; private Material _previousMaterialInstance; // Hashes private static readonly int _sizeHash = Shader.PropertyToID("_Size"); private void Start() { _mainCamera = CombatCameraManager.Instance.MainCamera; } private void Update() { if (!_mainCamera) return; var direction = _mainCamera.transform.position - transform.position; var ray = new Ray(transform.position, direction.normalized); if (Physics.Raycast(ray, out var hit, 100f, _maskLayer)) { _hitMaterialInstance = hit.collider.GetComponent()?.MaterialInstance; if (!_hitMaterialInstance) return; if (!_hitMaterialInstance.HasProperty(_sizeHash)) return; if (_previousMaterialInstance && _previousMaterialInstance != _hitMaterialInstance && _previousMaterialInstance.HasProperty(_sizeHash)) { _previousMaterialInstance.SetFloat(_sizeHash, 0f); } _hitMaterialInstance.SetFloat(_sizeHash, _size); _previousMaterialInstance = _hitMaterialInstance; } else { if (!_previousMaterialInstance) return; if (_previousMaterialInstance.HasProperty(_sizeHash)) { _previousMaterialInstance.SetFloat(_sizeHash, 0f); } _previousMaterialInstance = null; } } } }