Ch 4. 점수 + 콤보 시스템

Date:     Updated:

카테고리:

태그:

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

🚀 점수 + 콤보 시스템

✈ UI

image

image

텍스트는 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 붙이고 컨트롤러도 작성해 할당해 준 상태

image


📜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 붙이고 컨트롤러도 작성해 할당해 준 상태

image


📜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);
        }
    }




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

맨 위로 이동하기

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

댓글 남기기