CapersProject/Assets/02.Scripts/FadeableObject.cs
Nam Tae Gun 7fb0da5888 #25, #26 아이템 직접 획득 방식 추가 및 선형적인 맵 구조 변경
+ Item관련 Excel, Json, So 수정
+ DropItemTable 로직 수정
+ 아이템 프리팹에서 Enable Interaction 체크하면 직접 룻팅, 해제하면 자동 룻팅
+ 체력회복 아이템 추가
+ 개발자 메뉴 상호작용 "F1" 키를 통해 접근 가능
+ 보스 맵은 마법진을 상호작용하면 보스전 시작
+ 맵 안에서 교전 중일 때, 투명 벽 쉐이더 추가
+ 맵 마다의 통로를 통해서 이동 가능
+ 선형적인 맵 구조에 맞게 리소스 및 위치 수정
+ 타이틀 화면으로 이동할 때 나타나는 오류 수정(CombatUiManager OnDisable 싱글톤 문제)

Closes #25, #26
2024-06-22 07:11:53 +09:00

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;
[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;
}
}
}