// 인스턴스
public static GameManager Instance = null;
public void Awake()
{
if (Instance == null)
{
Instance = this;
}
}
Application.CancelQuit();
나는 위 코드만 있으면 게임이 알아서 멈추고 어쩌고 하는줄 알았다. 검색을 해봐도 이런 코드만 주구장창 나오는데 저게 아니면 유니티 자체를 종료해야하니(그러면 안됨) 어떻게 해야할지 몰라서 삽질을 좀 해보기로했다.
👾진행 순서
1. 게임 오버 UI 생성(옵션 화면 : GameOver, 다시 하기, 게임 종료)
2. GameManager.cs에 스크립트 작성
3. 적용
👾구현
1. 게임 오버 UI 생성(옵션 화면 : GameOver, 다시 하기, 게임 종료)
GameOver_Option : Empty
GameOver_Background : UI > Panel (Img로 만들어도 무방)
Text : UI > Text
GameOver_Restart, Quit : UI > Button
본인 취향에 맞게 배치하고 스크립트를 만들어준다.
2. GameManager.cs에 스크립트 작성
// 게임 상태 상수
public enum GameState
{
Ready,
Restart,
Pause,
Quit
}
// 현재 게임 상태 변수
public GameState gState;
// game over UI
public GameObject gameOverUI;
우선 게임 상태 상수와 상태를 담을 변수, UI를 담을 변수를 만들어준다.
UI는 스크립트를 적용하여 직접 동작할 수 없기 때문에 UI를 받아오는 동작이 필요하다. (내가 이해한게 맞다면,,)
// 인스턴스
public static GameManager Instance = null;
public void Awake()
{
if (Instance == null)
{
Instance = this;
}
}
그리고 인스턴스도 선언해준다.
처음에는 인스턴스없이 DestoryZone.cs에서 GameManager 객체를 불러와서 함수를 실행시켜봤더니 실행이,, 안됐다. 공부를 해보니 Manager같은 경우에는 Static으로 관리를해서 인스턴스를 생성 후 함수에 접근하면 편리하다는 사실을 알았다.
그래서 위처럼 인스턴스를 선언해주고 Awake는 생성자라고 생각하면 된다. 인스턴스를 본인 자신으로 초기화해주는 단계이다.
using UnityEngine.UI;
using UnityEngine.SceneManagement;
,,, 생략 ,,,
public void OpenGameOverUI()
{
// 옵션 창 활성화
gameOverUI.SetActive(true);
Debug.Log("옵션창을 활성화합니다.");
// 게임 속도 0배속
Time.timeScale = 0f;
// 게임 종료
gState = GameState.Quit;
}
// 처음부터 다시 하기
public void RestartGame()
{
// 게임 속도 1배속으로 설정
Time.timeScale = 1f;
// 처음부터 시작
SceneManager.LoadScene(0);
}
// 게임 종료
public void QuitGame()
{
// 게임 종료
Application.Quit();
Debug.Log("게임을 종료합니다.");
}
,,, 생략 ,,,
void Start()
{
// 게임 시작시 게임오버 패널 끄기
gameOverUI.SetActive(false);
}
그리고 위의 스크립트를 짜준다.
게임 시작시 게임오버 패널이 꺼져있어야 하므로 start()에서 게임오버 패널을 꺼준다.
그리고 차례대로 옵션창 활성화, 게임 종료, 다시 시작 스크립트를 작성해준다.
옵션창 활성화는 DestroyZone에서 Player가 닿으면 실행 될 예정이라 저기서 손대줄 것은 없다.
다시 시작 스크립트는 UnityEngine.SceneManagement;를 선언해주고 사용해준다.
SceneManager.LoadScene(0); 뜻은 0번째 씬(시작하는 씬)을 로드해달라는 의미다.
** 게임종료에 사용되는 Application.Quit();는 유니티상에선 동작하지 않는 것 처럼 보이니 Debug.log를 사용하여 작동하는지 확인을 해줬다. 나는 이 사실을 몰라서 시간을 많이 허비했다 ㅠ.ㅠ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
// 게임 상태 상수
public enum GameState
{
Ready,
Restart,
Pause,
Quit
}
// 현재 게임 상태 변수
public GameState gState;
// game over UI
public GameObject gameOverUI;
// Game Over
public void OpenGameOverUI()
{
// 옵션 창 활성화
gameOverUI.SetActive(true);
Debug.Log("옵션창을 활성화합니다.");
// 게임 속도 0배속
Time.timeScale = 0f;
// 게임 종료
gState = GameState.Quit;
}
// 처음부터 다시 하기
public void RestartGame()
{
// 게임 속도 1배속으로 설정
Time.timeScale = 1f;
// 처음부터 시작
SceneManager.LoadScene(0);
}
// 게임 종료
public void QuitGame()
{
// 게임 종료
Application.Quit();
Debug.Log("게임을 종료합니다.");
}
// 인스턴스
public static GameManager Instance = null;
public void Awake()
{
if (Instance == null)
{
Instance = this;
}
}
// Start is called before the first frame update
void Start()
{
// 게임 시작시 게임오버 패널 끄기
gameOverUI.SetActive(false);
}
// Update is called once per frame
void Update()
{
}
}
GameManager.cs 전체 코드
3. 적용
하이어라키뷰에 GameManager를 Empty로 만들어준다. 그리고 방금 만든 스크립트를 드래그 앤 드롭
적용된 스크립트에 보면 우리가 만든 변수 GameOverUI가 만들어진 것이 보인다.
여기에 우리가 만든 GameOver_Option을 드래그 앤 드롭
이제 GameOver_Restart, Quit 버튼에 클릭 이벤트를 넣어주면 된다.
GameOver_Restart를 클릭하고 인스펙터 창 > button에 보면 On Click()이 있다.
+ 버튼을 눌러서 추가 > 하이어라키창에 있는 GameManager를 검은색 박스로 드래그 앤 드롭. 하고나면 위 사진처럼 GameManager가 들어가있다.
그리고 우측 function버튼을 눌러서 우리가 만든 함수를 알맞게 적용하면 된다.
👾결과
'동식이 취업시키기 작전 > FPS - Penguin party(feat. unity)' 카테고리의 다른 글
[Unity] Particle 적용하는 방법(feat. Delta Time) (2) | 2023.07.31 |
---|---|
[Unity] 씬 분리하기(== 씬 만들기), 씬 전환하기(feat. 기존 씬으로 돌아가기) (0) | 2023.07.29 |
[Unity] Enemy 랜덤으로 생성하기 (4) | 2023.07.28 |