+ CharacterHighlighting (캐릭터 오브젝트에 부착) + FadeableObject (투명화 시킬 오브젝트에 부착)따로 투명화 시킬 오브젝트에 bool값 true로 변경 + BasePropsOpaqueLit.prefab, BaseFurnitureOpaqueLit.prefab의 visualLook 추가
59 lines
1.9 KiB
C#
59 lines
1.9 KiB
C#
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<FadeableObject> _currentFadeables;
|
|
private List<FadeableObject> _previousFadeables;
|
|
|
|
private void Start()
|
|
{
|
|
_mainCamera = Camera.main;
|
|
_raycastHits = new RaycastHit[_maxHitCount];
|
|
_currentFadeables = new List<FadeableObject>(_maxHitCount);
|
|
_previousFadeables = new List<FadeableObject>(_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<FadeableObject>();
|
|
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);
|
|
}
|
|
}
|
|
} |