유니티 오브젝트 멈추기 - yuniti obeujegteu meomchugi

참고 영상
Youtube - BracKeys
유니티 내 세팅

- 유니티 하이어라키 창에서 Create > UI > Canvas, Panel을 통해서 일시정지를 위한 패널을 만들어 둔 뒤 각 버튼들을 세팅, 일단은 비활성화 했습니다

using System.Collections; using System.Collections.Generic; using UnityEngine; //using UnityEngine.SceneManagement; public class PauseMenu : MonoBehaviour{ // 다른 스크립트에서 쉽게 접근이 가능하도록 static public static bool GameIsPaused = false; public GameObject pauseMenuCanvas; void Update(){ if(Input.GetKeyDown(KeyCode.Escape)){ if(GameIsPaused){ Resume(); } else { Pause(); } } } public void Resume(){ pauseMenuCanvas.SetActive(false); Time.timeScale = 1f; GameIsPaused = false; } public void Pause(){ pauseMenuCanvas.SetActive(true); Time.timeScale = 0f; GameIsPaused = true; } public void ToSettingMenu(){ Debug.Log("아직 미구현입니다..."); } public void ToMain(){ Debug.Log("아직 미구현입니다..."); //Time.timeScale = 1f; //SceneManager.LoadScene("MainMenu"); } public void QuitGame(){ Debug.Log("아직 미구현입니다..."); Application.Quit(); } }

 또한 위 스크립트가 담깉 파일을 만들고 이 파일을 위 Canvas에 넣어 뒀습니다.

이후 각 버튼에는 이런 식으로 해당하는 함수를 지정해 버튼을 클릭하면 함수를 호출하게 제작을 했습니다.

위 스크립트의 기능
public GameObject pauseMenuCanvas; void Update(){ if(Input.GetKeyDown(KeyCode.Escape)){ if(GameIsPaused){ Resume(); } else { Pause(); } } }

 GameObject 변수에 일시정지 메뉴를 위해 만든 Panel을 넣어 둔 뒤 Esc키를 누름에 따라 메뉴를 부르고, 지우는 역할을 하게 했습니다.

 만약 현재 메뉴가 불러져 있다면 (GameIsPaused == true) Resume를 호출하고 아니라면 Pause를 호출하게 했습니다.

public void Resume(){ pauseMenuCanvas.SetActive(false); Time.timeScale = 1f; GameIsPaused = false; } public void Pause(){ pauseMenuCanvas.SetActive(true); Time.timeScale = 0f; GameIsPaused = true; } public void ToSettingMenu(){ Debug.Log("아직 미구현입니다..."); } public void ToMain(){ Debug.Log("아직 미구현입니다..."); //Time.timeScale = 1f; //SceneManager.LoadScene("MainMenu"); } public void QuitGame(){ Debug.Log("아직 미구현입니다..."); Application.Quit(); }

 위 함수들은 각 기능을 하는 버튼들로 Time.timeScale를 이용해 게임을 일시정지, 진행 하게 했으며 pauseMenuCanvus에 담아둔 패널을 SetActive를 통해 끄고 켤 수 있게 했습니다.

 나머지 함수들의 경우 이후 메인 메뉴 제작, 음향 설정에 대해서 배운다면 추가할 계획입니다.

여기서 주의할 것
public static bool GameIsPaused = false;

 위 영상을 시청한다면 알 수 있지만 Time.timeScale에 영향을 받지 않는 요소들이 있습니다. 제가 알아본 바로는

    - Update : 계속해서 함수 호출    /    FixedUpdate : 호출하지 않음

    - 코루틴의 WaitForSeconds : 멈춤    /    WaitForSecondsRealtime : 안멈춤

 정도가 있습니다.

 여기서 저 변수를 static으로 선언한 이유가 있는데, 만약 게임 일시정지를 했을 시 작동되지 않아야 할게 작동이 된다면 코드에 if (GameIsPaused) 와 같은 조건문을 넣어 제어할 수 있게 할 의도입니다. 전역으로 선언했으니 모든 스크립트에서 추가 과정 없이 간단하게 접근이 가능합니다.

안녕하세요 ~ 오늘은 게임에서 많이들 쓰이는 일시정지 기능에 대해서 알아보려고 합니다 :D 

굳이 추가할 필요 없지만 멈춰 있다는 걸 보여드리기 위해서 저는 Plane과 Cube를 배치할게요 ~

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Rotate : MonoBehaviour {

void Update() {

transform.Rotate(new Vector3(111* 90 * Time.deltaTime);

}

}

cs

그리고 공중에 띄어놓은 Cube 오브젝트를 천천히 회전하도록 만들게요. 굳이 해야하는 작업은 아닙니다 !

일단 오브젝트가 잘 회전하는지 봤는데 잘 돌아가네요 ~

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Pause : MonoBehaviour {

bool IsPause;

// Use this for initialization

void Start () {

IsPause = false;

}

// Update is called once per frame

void Update () {

if (Input.GetKeyDown(KeyCode.T))

{

/*일시정지 활성화*/

if (IsPause == false)

{

Time.timeScale = 0;

IsPause = true;

return;

}

/*일시정지 비활성화*/

if (IsPause == true)

{

Time.timeScale = 1;

IsPause = false;

return;

}

}

}

}

cs

이제 스크립트를 작성합시다 ~

먼저 일시정지 상태인지 알 수 있도록 bool IsPause; bool 타입의 변수를 하나 추가해주고 Start에서 값을 초기화 시킵니다.

일시정지를 시킬 조건으론 키보드 T 버튼을 지정했습니다.

if (Input.GetKeyDown(KeyCode.T))

그리고 핵심이 되는 아이가 바로 Time.timeScale 인데요. 이걸

Time.timeScale = 0;으로 하면 시간을 정지

Time.timeScale = 1;으로 하면 시간을 정상으로 되돌린 다는 말입니다.

그리고 일시정지 상태라면 원래 상태로, 원래 상태라면 일시정지로 되어야 하기 때문에 상태를 알 수 있는 IsPause 값을 조건에 따라 참, 거짓으로 바꿔줍니다.

그러면 T 키를 입력하면 보기와 같이 시간이 멈추는 걸 볼 수 있습니다 ~

(저는 시간이 멈추는 걸 시각화 하기 위해 UI가 나타나도록 코딩했습니다.)

여담으로 TimeScale 값이 곧 시간의 흐름을 나타냅니다. 0은 0% 1은 100% 라고 생각하시면 될 것 같습니다. 때문에 1 이상의 값을 주면, 예로 2를 준다고 가정하면 시간이 2배로 빠르게 지나가겠죠 ?

Toplist

최신 우편물

태그