CapersProject/Assets/02.Scripts/BlueWater/SeeThrough.cs

60 lines
1.9 KiB
C#
Raw Normal View History

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<IMaterialInstance>()?.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;
}
}
}
}