싱글턴
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 56개 중 13번째.
Inspector 참조에는 드래그해서 놓을 대상이 필요합니다. 게임 중 스포너가 생성하는 적은 프리팹에서 나오며, 프리팹은 에셋과 자기 자신의 구성 요소만 가리킬 수 있고 씬의 오브젝트는 가리킬 수 없으므로 GameManager 필드는 비어 있습니다. 일반적인 해결 방법은 싱글톤입니다. GameManager가 클래스 이름을 통해 모든 스크립트에서 접근할 수 있는 필드에 자기 자신을 저장합니다.
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private int kills;
void Awake()
{
Instance = this;
}
public void EnemyDown()
{
kills++;
Debug.Log("Kills: " + kills);
}
}// Enemy.cs, 적 프리팹에 있음
public void Die()
{
GameManager.Instance.EnemyDown();
Destroy(gameObject);
}static은 필드가 오브젝트가 아니라 클래스에 속한다는 뜻입니다. 각 GameManager 오브젝트는 저마다의 kills를 갖게 되지만, 게임 전체에는 Instance가 하나뿐이며 클래스 이름을 사용해 접근합니다. GameManager.Instance. 자신의 필드에 값을 지정할 필요 없이, 1분 전에 생성된 적을 포함해 어떤 스크립트에서든 읽을 수 있습니다.
매니저는 Awake에서 Instance = this;를 설정합니다. 여기서 this는 스크립트 자체를 뜻합니다. Unity는 어떤 Start보다 먼저 씬의 모든 Awake를 실행하므로, 다른 스크립트는 Start부터 GameManager.Instance를 사용할 수 있습니다. 씬에 두 번째 GameManager가 있으면 그 오브젝트가 Instance를 자기 자신으로 덮어씁니다. Scenes and Levels 챕터에서는 이를 막는 방법을 살펴봅니다.
챌린지
쉬움유성이 비처럼 쏟아집니다. Spawner는 프리팹에서 1.5초마다 Meteor를 떨어뜨리고, 화살표 키로 Player를 움직이며, GameManager는 MeteorCaught()로 잡은 유성을 세고, 땅에 떨어진 유성은 MeteorLanded()로 셉니다. 이 스크립트들은 준비되어 있습니다.
Meteor 스크립트는 game 필드를 통해 보고하지만, 유성은 프리팹에서 생성되므로 game이 비어 있어 보고가 모두 실패합니다. 싱글턴으로 이를 해결하세요.
GameManager.cs에서 GameManager 형식의 public static 필드Instance를 추가하고 Awake에서 이 스크립트로 설정하세요.Meteor.cs에서game필드를 삭제하고 대신GameManager.Instance를 통해 보고하세요.
Play를 누르고 유성을 몇 개 잡고 몇 개 놓친 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public TMP_Text caughtText;
public TMP_Text shieldText;
private int caught;
private int shield = 3;
public void MeteorCaught()
{
caught++;
caughtText.text = "Caught: " + caught;
}
public void MeteorLanded()
{
shield--;
shieldText.text = "Shield: " + shield;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.