Ch 4. 점수 + 콤보 시스템
카테고리: Unity Lesson 4
태그: Unity Game Engine
케이디님의 [유니티 강좌] 리듬 게임 유튜브 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click
🚀 점수 + 콤보 시스템
✈ UI
텍스트는 Outline 컴포넌트를 이용하여 외곽선 넣음
📜ComboManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ComboManager : MonoBehaviour
{
[SerializeField] GameObject goComboImage = null;
[SerializeField] Text txtCombo = null;
int currentCombo = 0;
Animator myAnim;
string animComboUp = "ComboUp";
private void Start()
{
myAnim = GetComponent<Animator>();
txtCombo.gameObject.SetActive(false);
goComboImage.SetActive(false);
}
public void IncreaseCombo(int p_num = 1)
{
currentCombo += p_num;
txtCombo.text = string.Format("{0:#,##0}", currentCombo);
if (currentCombo > 2) // 3콤보 이상
{
txtCombo.gameObject.SetActive(true);
goComboImage.SetActive(true);
myAnim.SetTrigger(animComboUp);
}
}
public void ResetCombo()
{
currentCombo = 0;
txtCombo.text = "0";
txtCombo.gameObject.SetActive(false);
goComboImage.SetActive(false);
}
public int GetCurrentCombo()
{
return currentCombo;
}
}
- 3콤보 이상부터 콤보 이미지와 텍스트를 활성화 시키고 콤보 애니메이션 재생
- 콤보 애니메이션 만들어 Animator 붙이고 컨트롤러도 작성해 할당해 준 상태
📜ScoreManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour
{
[SerializeField] Text txtScore = null;
[SerializeField] int increaseScore = 10;
int currentSrore =0;
[SerializeField] float[] weight = null;
[SerializeField] int comboBonusScore = 10;
Animator myAnim;
string animScoreUp = "ScoreUp";
ComboManager theCombo;
private void Start()
{
theCombo = FindObjectOfType<ComboManager>();
myAnim = GetComponent<Animator>();
currentSrore = 0;
txtScore.text = "0";
}
public void IncreaseScore(int p_JudgementState)
{
// 콤보 증가
theCombo.IncreaseCombo();
// 콤보 보너스 점수 계산
int t_currentCombo = theCombo.GetCurrentCombo();
int t_bonusComboScore = (t_currentCombo / 10) * comboBonusScore; // ex) 10~19 콤보는 추가점수 10, 30~39 콤보는 추가점수 30.
// 판정 가중치 계산
int t_increaseScore = increaseScore + t_bonusComboScore; // 추가할 점수 (기본 증가점수 + 콤보 추가점수)
t_increaseScore = (int)(t_increaseScore * weight[p_JudgementState]); // 판정에 따른 가중치 적용. 최종적으로 추가할 점수 완성
// 점수 반영
currentSrore += t_increaseScore;
txtScore.text = string.Format("{0:#,##0}", currentSrore);
// 애니메이션 실행
myAnim.SetTrigger(animScoreUp);
}
}
- 점수 텍스트에 적용할 애니메이션 만들어 Animator 붙이고 컨트롤러도 작성해 할당해 준 상태
📜TimingManager
ComboManager theCombo;
theCombo = FindObjectOfType<ComboManager>();
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);
// Perfect, Cool, Good 이펙트 연출 + 콤보 증가
if (j < timingBoxs.Length - 1)
theEffect.NoteHitEffect();
// 판정
theEffect.JudgementEffect(j);
// 점수 증가
theScoreManager.IncreaseScore(j);
return;
}
}
}
// 스페이스바 누르긴 했는데 아예 판정이 안된 Miss
theCombo.ResetCombo(); // 콤보 초기화
theEffect.JudgementEffect(timingBoxs.Length);
}
📜NoteManager
ComboManager theCombo;
theCombo = FindObjectOfType<ComboManager>();
// 스페이스바 조차도 누르지 않아서 화면 밖으로 나간 Miss들...
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.CompareTag("Note"))
{
if (collision.GetComponent<Note>().GetNoteFlag())
{
theEffect.JudgementEffect(4);
theCombo.ResetCombo();
}
theTimingManager.boxNoteList.Remove(collision.gameObject);
ObjectPool.instance.noteQueue.Enqueue(collision.gameObject);
collision.gameObject.SetActive(false);
}
}
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기