+ CharacterHighlighting (캐릭터 오브젝트에 부착) + FadeableObject (투명화 시킬 오브젝트에 부착)따로 투명화 시킬 오브젝트에 bool값 true로 변경 + BasePropsOpaqueLit.prefab, BaseFurnitureOpaqueLit.prefab의 visualLook 추가
101 lines
3.1 KiB
C#
101 lines
3.1 KiB
C#
using System.Collections;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine;
|
|
|
|
namespace BlueWater
|
|
{
|
|
public class FadeableObject : MonoBehaviour
|
|
{
|
|
[field: SerializeField]
|
|
public bool IsFadeable { get; private set; }
|
|
|
|
[SerializeField, ShowIf("@IsFadeable")]
|
|
private Material _transparentMaterial;
|
|
|
|
[SerializeField, Range(0f, 1f), ShowIf("@IsFadeable")]
|
|
private float _transparency = 0.5f;
|
|
|
|
[SerializeField, Range(0f, 2f), ShowIf("@IsFadeable")]
|
|
private float _fadeDuration = 0.5f;
|
|
|
|
private Renderer _originalRenderer;
|
|
private Material _originalMaterial;
|
|
private Coroutine _currentCoroutine;
|
|
private bool _isTransparent;
|
|
|
|
private void Start()
|
|
{
|
|
_originalRenderer = GetComponentInChildren<Renderer>();
|
|
_originalMaterial = _originalRenderer.material;
|
|
}
|
|
|
|
public void SetTransparent()
|
|
{
|
|
if (_isTransparent) return;
|
|
|
|
if (_currentCoroutine != null)
|
|
{
|
|
StopCoroutine(_currentCoroutine);
|
|
}
|
|
_currentCoroutine = StartCoroutine(FadeToTransparent());
|
|
}
|
|
|
|
public void RestoreOriginal()
|
|
{
|
|
if (!_isTransparent) return;
|
|
|
|
if (_currentCoroutine != null)
|
|
{
|
|
StopCoroutine(_currentCoroutine);
|
|
}
|
|
_currentCoroutine = StartCoroutine(RestoreMaterial());
|
|
}
|
|
|
|
private IEnumerator FadeToTransparent()
|
|
{
|
|
_isTransparent = true;
|
|
var material = new Material(_transparentMaterial);
|
|
_originalRenderer.material = material;
|
|
var startAlpha = material.color.a;
|
|
var duration = _fadeDuration * Mathf.Abs(startAlpha - _transparency);
|
|
var elapsedTime = 0f;
|
|
|
|
while (elapsedTime < duration)
|
|
{
|
|
var alpha = Mathf.Lerp(startAlpha, _transparency, elapsedTime / duration);
|
|
var color = material.color;
|
|
color.a = alpha;
|
|
material.color = color;
|
|
|
|
elapsedTime += Time.deltaTime;
|
|
yield return null;
|
|
}
|
|
|
|
var finalColor = material.color;
|
|
finalColor.a = _transparency;
|
|
material.color = finalColor;
|
|
}
|
|
|
|
private IEnumerator RestoreMaterial()
|
|
{
|
|
_isTransparent = false;
|
|
var startAlpha = _originalRenderer.material.color.a;
|
|
var targetAlpha = _originalMaterial.color.a;
|
|
var duration = _fadeDuration * Mathf.Abs(startAlpha - targetAlpha);
|
|
var elapsedTime = 0f;
|
|
|
|
while (elapsedTime < duration)
|
|
{
|
|
var alpha = Mathf.Lerp(startAlpha, targetAlpha, elapsedTime / duration);
|
|
var color = _originalRenderer.material.color;
|
|
color.a = alpha;
|
|
_originalRenderer.material.color = color;
|
|
|
|
elapsedTime += Time.deltaTime;
|
|
yield return null;
|
|
}
|
|
|
|
_originalRenderer.material = _originalMaterial;
|
|
}
|
|
}
|
|
} |