2D rpg 게임에서 힌트나 아이템이 있는 곳에서 발생하는 반짝임 효과를 적용해보자.

[유니티6][2D 게임] 팩맨(PACMAN) 03 - 아이템 반짝임 효과(FadeEffect)
using System.Collections;
using UnityEngine;
public class FadeEffect : MonoBehaviour
{
[SerializeField]
private float minFadeTime = 1f;
[SerializeField]
private float maxFadeTime = 4f;
private float fadeTime;
private SpriteRenderer spriteRenderer;
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
fadeTime = Random.Range(minFadeTime, maxFadeTime);
StartCoroutine(nameof(FadeLoop));
}
private IEnumerator FadeLoop()
{
while ( true )
{
// Alpha 값을 1에서 0으로 : Fade Out
yield return StartCoroutine(OnFade(1, 0));
// Alpha 값을 0에서 1로 : Fade In
yield return StartCoroutine(OnFade(0, 1));
}
}
private IEnumerator OnFade(float start, float end)
{
float percent = 0;
while ( percent < 1 )
{
// fadeTime 시간동안 while() 반복문 실행
percent += Time.deltaTime / fadeTime;
// percent는 0 -> 1로 증가하고 그 값에 따라 Alpha 값을 변화시킴
Color color = spriteRenderer.color;
color.a = Mathf.Lerp(start, end, percent);
spriteRenderer.color = color;
yield return null;
}
}
}
해당 유튜브와 스크립트를 참고하고 변형하여 스크립트를 작성했다.
위 스크립트는
팩맨 아이템 오브젝트 여러 개가 랜덤으로 반짝이는 효과를 구현한다.
그러나 내가 제작 중인 게임에서는

이렇게 아이템이나 힌트가 위치하는 한 군데에서 반짝이는 효과를 만들고 싶었다.
랜덤한 시간으로 반짝임을 구현할 필요없이 일정한 시간 간격으로 fade in/out 효과만 구현하면 된다.
따라서
[SerializeField]
private float minFadeTime = 1f;
[SerializeField]
private float maxFadeTime = 4f;
fadeTime = Random.Range(minFadeTime, maxFadeTime);
부분을 수정하여 구현하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.PlayerLoop;
public class Twinkle : MonoBehaviour
{
private float fadeTime;
private SpriteRenderer spriteRenderer;
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
fadeTime = 0.5f;
StartCoroutine(nameof(FadeLoop));
}
private IEnumerator FadeLoop(){
while (true){
// Alpha 값을 1에서 0으로 (0에서 1으로) : fade out(in)
yield return StartCoroutine(OnFade(1,0));
yield return StartCoroutine(OnFade(0,1));
}
}
private IEnumerator OnFade(float start, float end){
float percent = 0;
while (percent < 1){
// fadeTime 시간동안 while() 반복문
percent += Time.deltaTime / fadeTime;
// percent는 0 -> 1로 증가하고 그 값에 따라 Alpha값을 변화시킴
Color color = spriteRenderer.color;
color.a = Mathf.Lerp(start,end,percent);
spriteRenderer.color = color;
yield return null;
}
}
}
Awake()
SpriteRenderer를 가져오고, fadeTime을 0.5초로 설정한다.
FadeLoop() 코루틴을 실행해서 깜빡임을 반복시킨다.
FadeLoop()
무한 루프 돌리면서:
알파값을 1 → 0 으로 줄여서 투명하게 만들고 (OnFade(1,0))
다시 0 → 1로 올려서 보이게 한다. (OnFade(0,1))
OnFade(start, end)
percent를 이용해서 선형 보간 (Mathf.Lerp)으로 알파값을 서서히 변화시킨다.
fadeTime 동안 반복한다.
(Mathf.Lerp(a, b, t) : 두 숫자 a와 b 사이를 비율 t만큼 보간해서 값을 반환하는 함수이다.)

게임을 실행하면 의자 위에 있는 반짝임 효과가 0.5초 간격으로 fade in/out하며 반짝거린다.