[Unity][3D-Game] Tower Defense Game (19)

suhan0304·2023년 12월 23일
0
post-thumbnail

강의영상 (21)


개발

일시정지 UI

게임을 중간에 일시정지 할 수 있도록 기능을 구현할 예정인데 그 때 나올 UI를 새로 만들어준다. Overlay Canvas에 Panel를 하나 추가해준다.

  • 이름을 PauseMenu로 설정
  • Image를 지워서 none으로 설정
  • GameOver의 Image 컴포넌트 속성을 복사해서 그대로 붙여넣기
  • GameOver의 Menu 버튼을 복사해서 자식으로 붙여넣기
    - 버튼 이름을 Continue로 수정
    - Button 이벤트 제거
    - Canvas Group 컴포넌트 제거

해당 버튼을 적절한 위치에 놓고 사이즈를 키운 후에 텍스트를 "CONTINUE"로 수정한다.

버튼 두개를 추가해서 CONTINUE 밑에 절반씩 공간을 차지하도록 크기를 조절해준다.

이 때 따로 두개를 복사 붙여넣기 해도 되지만 빈 오브젝트를 만든 후에 해당 오브젝트에 Horizontal Layout Group 컴포넌트를 추가해준 후에 해당 오브젝트 자식으로 버튼 두개를 넣으면 자동으로 가로로 배열된다.
Control CHild Size 속성을 체크해주어야 자식 오브젝트(버튼)의 사이즈를 조절할 수 있다.

GameOver에서 GameOverText를 복사해서 가져온 후에 Pasue

  • 이름을 PausedText로 변경
  • Canvas Group 컴포넌트를 제거

사이즈를 적절히 조절해주고 Text의 Best Fit을 체크해주면 사이즈에 맞춰서 글자 크기가 늘어난다.

이제 PauseMenu를 비활성화 해주고 내부 기능을 구현한다.

PauseMenu 기능 구현

PauseMenu의 버튼을 눌렀을 때 작동할 기능들을 Game Master 오브젝트에 PauseMenu라는 스크립트로 작성한다.

PauseMenu.cs

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

public class PauseMenu : MonoBehaviour
{
    public GameObject ui;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.P))
        {
            Toggle();
        }
    }

    public void Toggle()
    {
        ui.SetActive(ui.activeSelf); //활성화 되어있으면 비활성화, 비활성화 되어있으면 활성화

        if (ui.activeSelf) //Pasued Menu 활성화
        {
            Time.timeScale = 0f; //시간 배속을 0으로 설정
        }
        else
        {
            Time.timeScale = 1f; //시간 배속을 1로 되돌리기
        }
    }

    public void Retry()
    {
        Toggle();
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);//현재 활성화 된 Scene을 다시 로드
    }

    public void Menu()
    {
        Debug.Log("Go to Menu"); //메뉴로 돌아가기
    }
}

이제 Continue, Retry, Menu 버튼 이벤트에 각각 Toggle, Retry, Menu를 연결해준다.

PauseMenu 애니메이션 추가

이제 PauseMenu가 불러올 때 버튼과 텍스트에 적절한 애니메이션이 실행되도록 설정한다.

  • CanvasGroup을 추가해서 투명도가 0에서 1로 증가하도록 추가
  • Loop Time을 해제

TimeScale을 0으로 해서 시간을 정지해서 애니메이션도 실행되지 않고 정지해버린다. 따라서 Animator 컴포넌트의 Update Mode를 Unscaled Time으로 설정해서 시간이 멈춰도 애니메이션이 실행되도록 한다.

버튼별 애니메이션 구현

Continue 버튼에 Animator 컴포넌트를 추가해주고 Button이라는 이름을 애니메이션을 생성하고 컨트롤러를 연결시켜준다. 이 때 Transition을 Animation으로 변경한 후에 Auto Generate Animation을 누르면 자동으로 컨트롤러가 연결된다.

버튼의 각종 Trigger 별로 애니메이션을 설정할 수 있다.

  • Normal은 Scale이 (1, 1, 1)로 설정되도록 추가

  • Highlighted은 Scale이 0.00초 (1.05, 1.05, 1), 0.20초 (1.02, 1.02, 1), 0.40초 (1.05, 1.05, 1)로 설정되도록 추가

  • Pressed는 Scale이 (1, 1, 1)로 설정되도록 추가

이제 Animator을 활성화 해주고 Update Mode를 Unscaled Time으로 설정해준다.

이제 해당 Animator 컴포넌트를 복사한 후에 다른 두 버튼의 Button 컴포넌트의 Transition을 Animation으로 변경해주고 Animator 컴포넌트를 붙여넣기해줘서 똑같은 애니메이션이 실행되도록 설정한다.


결과물

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글