Writing the Game Manager
앞서 작성한 BoardManager와 생성만 해둔 GameManager를 모두 드래그해서 Hierarchy의 GamaManager 오브젝트에 연결한 후 GameManager 스크립트를 에디터로 엽니다.
퍼블릭, 프라이빗 변수 선언부터 합니다.
public BoardManager boardScript; // 보드매니저 스크립트의 레퍼런스
private int level = 3; // 레벨, 3부터 적이 나타나므로 3으로 초기화
| cs |
Awake()내에서 boardScript 레퍼런스를 찾아서 연결하고, InitGame()이라는 메소드를 실행합니다.
private void Awake()
{
boardScript = GetComponent<BoardManager>();
InitGame();
}
| cs |
InitGame()에서 SetupScene()을 호출합니다
void InitGame()
{
boardScript.SetupSecene(level);
}
| cs |
일단 여기서 스크립트를 저장하고 유니티로 돌아갑니다.
Hierarchy에서 GameManager를 선택하고 인스펙터를 보면 여러가지 프로퍼티들이 생성되어 있습니다. 여기에 프리팹들을 연결해야 하는데 다른 것을 눌러도 인스펙터 화면이 변하지 않도록 위의 자물쇠 아이콘을 눌러 고정합니다.
그리고 프리팹들을 연결한 후 자물쇠를 다시 해제합니다.
그리고 나서 실행해보면...
설정이 적적치 못해서 화면이 잘렸지만 맵이 잘 생성되었습니다.
Hierarchy에서 MainCamera를 선택하고 Position을 (3.5, 3.5, -10), Background를 검은색으로 바꿉니다.
다시 실행해 보겠습니다.
맵이 잘 생성된 것을 다시 확인 가능합니다.
이제 다시 GameManager를 수정합니다.
GameManager에 싱글톤 패턴을 적용하려 합니다. 싱글톤이란 인스턴스가 하나뿐인 객체를 생성하는 기법입니다. 게임 매니저가 레벨 로딩, 점수 관리 등을 행하기 때문에 여러 개가 존재해서는 안됩니다.
이미 작성한 변수 선언 위에
public static GameManager instance = null;
| cs |
private void Awake()
{
if (instance == null)
instance = this;
else if (instance != this)
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
...
}
| cs |
생성된 인스턴스가 없다면 현재의 인스턴스를 연결해주고, 기존의 인스턴스와 현재의 인스턴스가 다른 것이라면 원래 있던 것만 계속 유지될 수 있도록 새로 생성된 것은 파괴합니다. 그리고 내장 메소드인 DontDestroyOnLoad()를 사용하여 레벨과 레벨 사이에서도 인스턴스를 파괴하지 않도록 합니다.
스크립트를 저장하고 유니티로 돌아와서 Hierarchy의 GameManager를 Prefabs 폴더로 드래그하여 프리팹화 합니다.
여기까지 작성한 GameManager 전체 스크립트는 아래와 같습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager instance = null;
public BoardManager boardScript; // 보드매니저 스크립트의 레퍼런스
private int level = 3; // 레벨, 3부터 적이 나타나므로 3으로 초기화
private void Awake()
{
if (instance == null)
instance = this;
else if (instance != this)
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
boardScript = GetComponent<BoardManager>();
InitGame();
}
void InitGame()
{
boardScript.SetupSecene(level);
}
}
| cs |
한가지 간단한 스크립트가 더 필요합니다.
Scripts 폴더에 Loader라는 이름으로 새로운 스크립트를 생성하고 에디터로 엽니다. 이 Loader는 GameManager 오브젝트가 인스턴스화 되었는지를 체크합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Loader : MonoBehaviour
{
public GameManager gameManager;
void Awake ()
{
if (GameManager.instance == null)
Instantiate(gameManager);
}
}
| cs |
스크립트를 저장하고 유니티로 돌아와서 Hierarchy에 있는 GameManager를 지우고, Loader 스크립트를 MainCamera에 연결, Game Manager 프로퍼티에 GameManager 프리팹을 연결해 줍니다.
댓글 없음:
댓글 쓰기