+ MaterialPropertyBlock 사용 금지 -> Material Instance 방식으로 변경 (MaterialPropertyBlock은 URP프로젝트 중 SRP Batcher를 사용하는 경우 비추천 방식) + 플레이어 이동 방식 velocity 형태로 변경 중
60 lines
1.9 KiB
C#
60 lines
1.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |