Ch 13. 메뉴 구현 & 게임 리셋

Date:     Updated:

카테고리:

태그:

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

🚀 메뉴 구현

image

image

메인 메뉴에서 플레이 버튼 누르면 타이틀 메뉴로 넘어감. (메인 메뉴 비활, 타이틀 메뉴 활성화)

image

타이틀 메뉴에서 Back 버튼을 누르면 메인 메뉴로 돌아가고, Play 버튼을 누르면 게임 시작!

또 다른 씬을 만들어서 전환할 필요 없이 이렇게 이미지 엄청 크게 만들어서 다 가려버리게 하고(검은 배경.. 이미지 UI이다.) 이 이미지를 비활, 활성화 하여 씬 전환하는 효과를 주는 것도 좋은 방법인 것 같다.

✈ 타이틀 메뉴

📜TitleMenu

public class TitleMenu : MonoBehaviour
{
    [SerializeField] GameObject goStageUI = null;

    public void BtnPlay()  // 버튼 이벤트 등록
    {
        goStageUI.SetActive(true);  // 스테이지 메뉴 활성화
        this.gameObject.SetActive(false); // 타이틀 메뉴 끄고 
    }
}


✈ 스테이지 메뉴

📜StageMenu

public class StageMenu : MonoBehaviour
{
    [SerializeField] GameObject TitleMenuUI = null;
    
    public void BtnBack()  // 버튼 이벤트 등록
    {
        TitleMenuUI.SetActive(true); // 타이틀 메뉴 활성화
        this.gameObject.SetActive(false); // 스테이지 비활
    }

    public void BtnPlay()  // 버튼 이벤트 등록
    {
        GameManager.instance.GameStart(); // 게임 매니저를 통해 게임 스타트 (밑에서 작성)
        this.gameObject.SetActive(false); // 스테이지 비활
    }
}


✈ 게임 시작/종료시 해야될 처리

📜GameManager

public class GameManager : MonoBehaviour
{
    [SerializeField] GameObject[] goGameUI = null; // 게임이 시작되어야 비로소 활성화 되는 모든 오브젝트들 이 배열에 할당해둔 상태
    [SerializeField] GameObject goTitleUI = null;

    public static GameManager instance;
    public bool isStartGame = false;

    private void Start()
    {
        instance = this; // 싱글톤
    }

    public void GameStart()
    {
        for(int i = 0; i < goGameUI.Length; i++)
        {
            goGameUI[i].SetActive(true);
        }
        isStartGame = true;
    }

    public void MainMenu()
    {
        for (int i = 0; i < goGameUI.Length; i++)
        {
            goGameUI[i].SetActive(false);
        }
        goTitleUI.SetActive(true);
    }
}


📜NoteManager

    void Update()
    {
        if (GameManager.instance.isStartGame)
        {
            //...  
        }
    }

    public void RemoveNote()
    {
        GameManager.instance.isStartGame = false;



📜PlayerController

    void Update()
    {
        if (GameManager.instance.isStartGame)
        {


📜Result

    public void BtnMainMenu() // 버튼 이벤트 등록 (메인 메뉴로 돌아각기)
    {
        goUI.SetActive(false);
        GameManager.instance.MainMenu();
        theCombo.ResetCombo();
    }


🚀 게임 리셋하기

  • 게임을 새롭게 다시 시작하면 초가화 상태에서 게임할 수 있도록! (이전 게임 기록들 리셋)
  • 스테이지를 프리팹으로 만들어서 게임이 시작되면 스테이지가 Instantiate 되도록 하고 게임이 끝나면 Destroy 되도록 함

✈ 초기화

// 📜ScoreManager
    public void Initialized()
    {
        currentSrore = 0;
        txtScore.text = "0";
    }

// 📜TimingManager
    public void Initialized()
    {
        for (int i = 0; i < judgementRecord.Length; i++)
            judgementRecord[i] = 0;
    }

// 📜StatusManager
    public void Initialized()
    {
        currentHp = maxHp;
        currentShield = 0;
        currentShieldCombo = 0;
        shieldGauge.fillAmount = 0;
        isDead = false;
        SettingHPImage();
        SettingShieldImage();
    }

// 📜PlayerController
    public void Initialized()
    {
        transform.position = Vector3.zero;
        destPos = Vector3.zero;
        realCube.localPosition = Vector3.zero;
        canMove = true;
        s_canPressKey = true;
        isFalling = false;
        myRigid.useGravity = false;
        myRigid.isKinematic = true;
    }

// 📜CenterFlame
    public void ResetMusic()
    {
        musicStart = false;
    }


✈ 스테이지 프리팹 생성 파괴

// 📜StageManager
GameObject currentStage;

    public void RemoveStage()
    {
        if (currentStage != null)
            Destroy(currentStage);
    }

    public void SettingsStage()
    {
        stepCount = 0;
        
        currentStage = Instantiate(stage, Vector3.zero, Quaternion.identity);
        stagePlates = currentStage.GetComponent<Stage>().plates;
        totalPlateCount = stagePlates.Length;


📜GameManager

    private void Start()
    {
        instance = this;
        theCombo = FindObjectOfType<ComboManager>();
        theScore = FindObjectOfType<ScoreManager>();
        theTiming = FindObjectOfType<TimingManager>();
        theStatus = FindObjectOfType<StatusManager>();
        thePlayer = FindObjectOfType<PlayerController>();
        theStage = FindObjectOfType<StageManager>();
    }

    public void GameStart()
    {
        for(int i = 0; i < goGameUI.Length; i++)
        {
            goGameUI[i].SetActive(true);
        }
        theStage.RemoveStage();
        theStage.SettingsStage();
        theCombo.ResetCombo();
        theScore.Initialized();
        theTiming.Initialized();
        thePlayer.Initialized();
        theStatus.Initialized();

        isStartGame = true;
    }


✈ 겜 다시 시작하면 결과창 비활

// 📜Result
    public void closeResult()
    {
        goUI.SetActive(false);
    }

// 📜StageMenu
    Result result;
    result = FindObjectOfType<Result>();
    [SerializeField] GameObject resultUI = null; // Result UI 
    public void BtnPlay()
    {
        if (resultUI.activeSelf)
            theResult.closeResult();
        //..
    }

// 📜MainMenu
    Result result;
    result = FindObjectOfType<Result>();
    [SerializeField] GameObject resultUI = null; // Result UI 
    public void MainMenu()
    {
        if (resultUI.activeSelf)
            result.closeResult();


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

맨 위로 이동하기

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

댓글 남기기