[C#/Unity] 깜빡거리는 오브젝트 만들기

신지한·2023년 4월 28일
0

개발노트

목록 보기
1/13
post-thumbnail

📢 개발노트에 앞서서

본 개발노트는 혼자서 유니티 게임개발 독학하는 과정에서
유용하게 사용될만한 요소들을 구현 방법과 함께 기록&공유하는 게시글이며
부족한점이 있을 수 있어 참고해서 봐주시면 감사하겠습니다

깜빡거리는 오브젝트 만들기


🔎 개요

게임안에서 깜빡거리는 요소들이 자주 등장합니다
제가 현재 개발하고있는 게임에서도 필요해서 구현을 하게 되어서 velog에 공유해보려 합니다

구현에 사용된 Sprite는 현재 개발하고있는 게임에 사용된 Sprite를 사용했습니다
저희 팀원이 디자인한거 무단으로 사용해보았습니다ㅎㅎ;

버튼을 누르면 깜빡거림이 시작하는 기믹을 넣어보았습니다

그럼 구현 과정에 대해서 설명드리겠습니다


📝 구현과정

#1 오브젝트 생성 및 스크립트 생성

전체 생성한 오브젝트와 스크립트입니다
오브젝트: BlinkObject(Image), BlinkButton(Button), BlinkManager(Empty
스크립트: ButtonImage, ImageBlink
ButtonImage 스크립트는 기능이랑 관련없이 버튼이미지 바꾸려고 추가한겁니다!

UI를 작업하는거라 Canvas 상에서 구현을 했습니다

ImageBlink 전체코드 입니다

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ImageBlink : MonoBehaviour
{
    [SerializeField]
    private GameObject blinkObject;

    private Color orgColor;
    private bool check;

    public void Awake()
    {
        check = false;
        orgColor = new Color(1f, 1f, 1f, 1f);
    }

    public void SetBlink()
    {
        if (!check)
        {
            StartCoroutine("Blink", blinkObject);
            check = true;
        }
        else
        {
            StopCoroutine("Blink");
            blinkObject.GetComponent<Image>().color = orgColor;
            check = false;
        }
        
    }

    private IEnumerator Blink(GameObject gameObject)
    {
        Color tempColor = orgColor;

        gameObject.GetComponent<Image>().color = tempColor;
        while (true)
        {
            
            while (gameObject.GetComponent<Image>().color.a > 0f)
            {
                tempColor.a -= 0.1f;
                gameObject.GetComponent<Image>().color = tempColor;
                yield return new WaitForSeconds(0.05f);
            }
            yield return new WaitForSeconds(0.5f);
            while (gameObject.GetComponent<Image>().color.a < 1f)
            {
                tempColor.a += 0.1f;
                gameObject.GetComponent<Image>().color = tempColor;
                yield return new WaitForSeconds(0.05f);
            }
            yield return new WaitForSeconds(0.5f);
        }
    }
}

Button을 클릭시 SetBlink가 호출되고 SetBlink에선 코루틴으로 Blink 함수를 실행합니다


코드가 동작하는 방법은 다음과 같습니다

  • Blink로 전달된 gameObject의 알파값(a)을 스크립트 상에서 조절합니다
  • 만약 gameObject의 알파값이 0보다 클경우 0.1f값씩 줄여나가고 0보다 작을경우 0.1f씩 증가시킵니다
  • 코루틴을 사용하는 이유는 알파값이 시간간격을 두고 변화되는걸 구현하기 위함입니다
tempColor.a -= 0.1f;
gameObject.GetComponent<Image>().color = tempColor;
  • 위와같이 Color값을 변경하는 이유는
    gameObject.GetComponent<Image>().color.a -= 0.1f
    이런식으로 a값에 바로 접근할수 없기 때문입니다(다음과 같은 오류 발생)

  • 값이 모두 변경되었을때 다음 동작을 실행하기까지 0.5f의 텀을 두고 무한루프를 실행합니다

#3 BlinkManager, Button에 스크립트 Component로 추가하기


Blink ManagerImageBlink 스크립트를 Add Component를 하고 BlinkObject에 깜빡거릴 오브젝트를 추가합니다

OnClick()BlinkManager를 추가하고 해당 스크립트의 SetBlink 함수를 설정합니다
OnClick()의 첫번째는 기능과 관련이 없습니다!

📌 추가적인 설명

  • 코드의 개선의 여지가 있어보입니다
    • 무한루프 안에서 먼저 실행할 while문을 조건문으로 상황에 맞게 좀더 추가할 수 있을거 같습니다
    • 원래 있던 프로젝트의 코드를 인용하느라 추가적으로 설명할 부분이 있습니다
      • 한 오브젝트에 대해서 실행할거면 파라미터로 GameObject를 전달하지 않고 전역변수로 바로 변경할 수 있습니다
      • 해당 코드처럼 구현하게 될 경우 하나의 함수로 다양한 오브젝트에 적용이 가능합니다
      • [SerializeField]private으로 하여도 유니티 프로젝트와 직렬화를 시켜 오브젝트를 추가할 수 있어 유용하게 사용할 수 있습니다
    • 뭐든지 기능을 수행하는 ~Manager를 생성해서 사용하면 편하게 구현이 가능한거 같습니다
    • 코드안에서 WaitForSeconds() 안에 float값을 조정하면 깜빡거리는 속도를 조정할 수 있습니다

이상으로 깜빡거리는 오브젝트 구현에 대해서 포스팅 해보았습니다
궁금하신 점이 있으시면 댓글 남겨주시면 감사하겠습니다!!🙇‍

profile
게임 개발자 지망생

0개의 댓글