[Unity / 2D] 아이템 반짝임 효과

화이팅!·2025년 5월 5일

Unity

목록 보기
3/8
post-thumbnail

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하며 반짝거린다.

0개의 댓글