Ch 11. 체력과 쉴드

Date:     Updated:

카테고리:

태그:

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

🚀 체력과 쉴드 시스템

✈ UI

image

image

  • HP
    • 한번 추락할 때마다 HP 가 하나씩 감소한다.
    • HP 가 모두 없어지면 결과 UI 띄우고 게임 종료
    • 한번 추락하고나서 부활한 직후엔 5번 정도 깜빡이면서 무적 상태.
  • Shield
    • 평소엔 비활성화
    • 연속된 콤보로 쉴드 게이지가 가득차면 쉴드가 생긴다.
    • 쉴드는 최대 3개까지 가능하다.
    • 쉴드 한번은 HP 한번을 만회할 수 있다.
  • Timer 은 나중에 구현


✈ 코드

📜 StatusManager

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

public class StatusManager : MonoBehaviour
{
    [SerializeField] float blinkSpeed = 0.1f; // 깜빡이는 속도
    [SerializeField] int blinkCount = 10;  // 깜빡거릴 횟수 (키고 끄고 합해서 2회)
    int currentBlinkCount = 0; // 이게 blinkCount 에 다다르면 그만 깜빡거릴 것.
    bool isBlink = false;  // 지금 깜빡이는 중인지. 깜빡이고 있다면 무적상태여야.

    bool isDead = false;  // 죽은 상탱니지

    int maxHp = 3;  
    int currentHp = 3;

    int maxShield = 3;
    int currentShield = 0;  // 쉴드는 hp 와 다르게 0 에서 시작함. 게이지 다 찰때마다 쉴드 하나씩 증가

    [SerializeField] Image[] hpImage = null;
    [SerializeField] Image[] shieldImage = null;

    [SerializeField] int shieldIncreaseCombo = 5; // 5번 연속 콤보때마다 쉴드 게이지 꽉차고 쉴드 하나씩 증가하게 할 것.
    int currentShieldCombo = 0;  // 이게 5에 다다르면 쉴드 하나 증가.
    [SerializeField] Image shieldGauge = null;

    Result theResult;
    NoteManager theNote;
    [SerializeField] MeshRenderer playerMesh = null; // 깜빡거리는 효과를 주기 위해 플레이어 큐브의 MeshRenderer를 비활/활성화 반복할 것.

    private void Start()
    {
        theResult = FindObjectOfType<Result>();
        theNote = FindObjectOfType<NoteManager>();
    }

    // 쉴드 게이지 업뎃
    // 5콤보 때마다 쉴드 1개씩 증가
    public void CheckShield()
    {
        currentShieldCombo++; 

        if (currentShieldCombo >= shieldIncreaseCombo)
        {
            currentShieldCombo = 0;
            IncreaseShield();
        }

        shieldGauge.fillAmount = (float)currentShieldCombo / shieldIncreaseCombo;
    }

    // 콤보 놓쳣을 때 다시 리셋해야 함. 게이지도 다시 빵으로.
    public void ResetShieldCombo()
    {
        currentShieldCombo = 0;
        shieldGauge.fillAmount = (float)currentShieldCombo / shieldIncreaseCombo;
    }

    // 쉴드 1개 증가. 대신 3개는 넘으면 안됨
    public void IncreaseShield()
    {
        currentShield++;

        if (currentShield >= maxShield)
            currentShield = maxShield;

        SettingShieldImage();
    }

    // 낭떠러지 추락할 때 쉴드 하나씩 깎아야 함
    public void DecreaseShield(int p_num)
    {
        currentShield -= p_num;

        if (currentShield <= 0)
            currentShield = 0;

        SettingShieldImage();
    }

    // 쉴드 이미지 활성화/비활성화 (currentShield 개수만 활성화)
    void SettingShieldImage()
    {
        for (int i = 0; i < shieldImage.Length; i++)
        {
            if (i < currentShield)
                shieldImage[i].gameObject.SetActive(true);
            else
                shieldImage[i].gameObject.SetActive(false);
        }
    }

    // HP 1 증가
    public void IncreaseHp(int p_num)
    {
        currentHp += p_num;
        if (currentHp >= maxHp)
            currentHp = maxHp;

        SettingHPImage();
    }

    // HP 1 깎기 (단, 깜빡일 때 말고! 깜빡일 떈 무적 효과여야. 그리고 쉴드 있을 땐 HP 대신 쉴드를 깎아야 함.)
    public void DecreaseHp(int p_num)
    {
        if (!isBlink)
        {
            if (currentShield > 0)
                DecreaseShield(p_num);
            else
            {
                currentHp -= p_num;

                if (currentHp <= 0)
                {
                    isDead = true;
                    theResult.ShowResult();
                    theNote.RemoveNote();
                }
                else
                {
                    StartCoroutine(BlinkCo());
                }
                SettingHPImage();
            }
        }
    }

    void SettingHPImage()
    {
        for (int i = 0; i < hpImage.Length; i++)
        {
            if (i < currentHp)
                hpImage[i].gameObject.SetActive(true);
            else
                hpImage[i].gameObject.SetActive(false);
        }
    }

    public bool Isdead()
    {
        return isDead;
    }

    // 깜빡이기 👉 플레이어 큐브의 Mesh 껐다 키기
    IEnumerator BlinkCo()
    {
        isBlink = true;
        while(currentBlinkCount <= blinkCount) // 이 짓을 10번 함
        {
            playerMesh.enabled = !playerMesh.enabled; // 끄거나 혹은 키거나 
            yield return new WaitForSeconds(blinkSpeed); // 1.5초마다
            currentBlinkCount++;
        }

        playerMesh.enabled = true; // 제대로 다시 켜주고
        currentBlinkCount = 0;
        isBlink = false;
    }
}

image


📜 PlayerController

StatusManager theStatus;
theStatus = FindObjectOfType<StatusManager>();

    public void ResetFalling()
    {
        theStatus.DecreaseHp(1);

        if(!theStatus.Isdead())
        {
            isFalling = false;
            myRigid.useGravity = false;
            myRigid.isKinematic = true;

            transform.position = originPos;
            realCube.localPosition = Vector3.zero;
        }
    }

플레이어가 죽은 상태가 아닐 때만, 즉 HP 가 하나라도 남아있어야 다시 부활할 수 있다.


📜 TimingManager

StatusManager theStatus;
theStatus = FindObjectOfType<StatusManager>();


                    if (CheckCanNextPlate())
                    {
                        theScoreManager.IncreaseScore(j);  // 점수 증가
                        theStage.ShowNextPlate(); // 다음 플레이트 호출
                        theEffect.JudgementEffect(j); // 판정 연출
                        judgementRecord[j]++;  // 판정 기록
                        theStatus.CheckShield(); // 쉴드 체크
                    }

    public void MissRecord()
    {
        judgementRecord[4]++;  // 판정 기록
        theStatus.ResetShieldCombo();
    }

쉴드 또한 매번 체크해주어야 한다. 게이지 세팅을 위해. Miss시 쉴드 게이지 리셋.




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

맨 위로 이동하기

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

댓글 남기기