Ch 2. 판정 이펙트 효과

Date:     Updated:

카테고리:

태그:

케이디님의 [유니티 강좌] 리듬 게임 유튜브 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click

🚀 이펙트 이미지 애니메이션

image

첫 번째 : Note Hit Effect

image

  • Sprite Mode Multiple
    • Single은 Sprite 하나가 그냥 Sprite 한개로 이루어진 경우다.
    • Multiple은 Sprite 하나가 여러개 Sprite 로 이루어진 경우다.
      • Sprite Editor 를 사용할 수 있다. (Sprite Editor 패키지 설치해야 됨)

image

SpriteEditor 에서 이렇게 하나의 Sprite를 5 X 2 = 10 개의 Sprite 로 쪼갠다. 이 Sprite 는 이제 10 개의 독립적인 Sprite 로 이루어져있게 된다.

image

air-blast 이미지 하나에 이렇게 10 개의 이미지가 들어있게 됨. 첫번째 이미지부터 열번째 이미지까지 차례대로 재생하면 그럴싸한 애니메이션이 될 것이다!

image

가운데에서 타격할 때마다 생겨나는 이펙트 효과로 쓸 것.

image

  • NoteHitEffect 이미지
    • 10 개의 Sprite 이미지를 차례대로 키로 추가. 첫 번재 이미지에서 열번째 이미지까지 시간 순서대로 NoteHitEffect 이미지 UI 의 Sprite 로 할당
    • 끝 프레임에서는 이미지를 비활성화 하여 보이지 않게 한다.

image

  • Empty 그냥 아무 일도 안하는 빈 상태이다.
  • 위에서 만든 애니메이션이 “Hit” 트리거가 발동되면 재생되도록 전이 조건을 짠다.


두 번째 : Judgement Effect

image

Judgement Effect 이미지의 Sprite 종류는 5 가지. (Perfect, Cool, Good, Bad, Miss)

image

image


🚀 이펙트 이미지 재생시키기

📜EffectManager

이미지들의 부모인 Effect에 붙인다.

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

public class EffectManager : MonoBehaviour
{
    [SerializeField] Animator noteHitAnimator = null;

    [SerializeField] Animator judgementAnimator = null;
    [SerializeField] Image judgementImage = null;
    [SerializeField] Sprite[] judgementSprite = null;

    string hit = "Hit";

    public void JudgementEffect(int p_num)
    {
        judgementImage.sprite = judgementSprite[p_num];
        judgementAnimator.SetTrigger(hit);
    }

    public void NoteHitEffect()
    {
        noteHitAnimator.SetTrigger(hit);
    }
}

image


📜TimingManager

    EffectManager theEffect;

    void Start()
    {
        theEffect = FindObjectOfType<EffectManager>();

        // ...
    }

    public void CheckTiming()
    {
        for(int i = 0; i < boxNoteList.Count; i++)
        {
            float t_notePosX = boxNoteList[i].transform.localPosition.x;

            // 판정 순서 : Perfect -> Cool -> Good -> Bad
            for (int j = 0; j < timingBoxs.Length; j++)
            {
                if (timingBoxs[j].x <= t_notePosX && t_notePosX <= timingBoxs[j].y)
                {
                    // 노트 제거
                    boxNoteList[i].GetComponent<Note>().HideNote();
                    boxNoteList.RemoveAt(i);

                    // 이펙트 연출 ⭐⭐
                    if (j < timingBoxs.Length - 1) // Perfect, Cool, Good 판정때만 이펙트 효과. Bad 일땐 X
                        theEffect.NoteHitEffect();
                    theEffect.JudgementEffect(j);

                    return;
                }
            }
        }

        theEffect.JudgementEffect(timingBoxs.Length);
    }


📜Note

    public bool GetNoteFlag()
    {
        return noteImage.enabled;
    }

화면 밖을 벗어나 콜라이더에 도달한 노트가 이미지가 안꺼져 있다면 Miss 인 것이다. 이를 알려주기 위해 만든 함수.


📜NoteManager

    EffectManager theEffect;

    void Start()
    {
        theTimingManager = GetComponent<TimingManager>();
        theEffect = FindObjectOfType<EffectManager>();
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.CompareTag("Note"))
        {
            if (collision.GetComponent<Note>().GetNoteFlag())
                theEffect.JudgementEffect(4); // 노트가 이미지 안꺼지고 그대로 화면 밖 벗어나면 Miss 스프라이트 띄우기
            theTimingManager.boxNoteList.Remove(collision.gameObject);
            Destroy(collision.gameObject);
        }
    }


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 4 카테고리 내 다른 글 보러가기

댓글 남기기