Ch 2. 판정 이펙트 효과
카테고리: Unity Lesson 4
태그: Unity Game Engine
케이디님의 [유니티 강좌] 리듬 게임 유튜브 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click
🚀 이펙트 이미지 애니메이션
첫 번째 : Note Hit Effect
- Sprite Mode
Multiple
Single
은 Sprite 하나가 그냥 Sprite 한개로 이루어진 경우다.Multiple
은 Sprite 하나가 여러개 Sprite 로 이루어진 경우다.- Sprite Editor 를 사용할 수 있다. (Sprite Editor 패키지 설치해야 됨)
SpriteEditor 에서 이렇게 하나의 Sprite를 5 X 2 = 10 개의 Sprite 로 쪼갠다. 이 Sprite 는 이제 10 개의 독립적인 Sprite 로 이루어져있게 된다.
air-blast 이미지 하나에 이렇게 10 개의 이미지가 들어있게 됨. 첫번째 이미지부터 열번째 이미지까지 차례대로 재생하면 그럴싸한 애니메이션이 될 것이다!
가운데에서 타격할 때마다 생겨나는 이펙트 효과로 쓸 것.
NoteHitEffect
이미지- 10 개의 Sprite 이미지를 차례대로 키로 추가. 첫 번재 이미지에서 열번째 이미지까지 시간 순서대로
NoteHitEffect
이미지 UI 의 Sprite 로 할당 - 끝 프레임에서는 이미지를 비활성화 하여 보이지 않게 한다.
- 10 개의 Sprite 이미지를 차례대로 키로 추가. 첫 번재 이미지에서 열번째 이미지까지 시간 순서대로
Empty
그냥 아무 일도 안하는 빈 상태이다.- 위에서 만든 애니메이션이 “Hit” 트리거가 발동되면 재생되도록 전이 조건을 짠다.
두 번째 : Judgement Effect
Judgement Effect 이미지의 Sprite 종류는 5 가지. (Perfect, Cool, Good, Bad, Miss)
🚀 이펙트 이미지 재생시키기
📜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);
}
}
📜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);
}
}
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기