Menu
CoddyTech

싱글턴

Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 60개 중 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를 사용해 접근합니다. 방금 전에 생성된 적을 포함해 어떤 스크립트에서든 자기 필드를 따로 채울 필요 없이 읽을 수 있습니다.

매니저는 Awake에서 Instance = this;를 설정하며, 여기서 this는 스크립트 자체를 뜻합니다. Unity는 Start가 실행되기 전에 씬의 모든 Awake를 실행하므로, 다른 스크립트는 Start부터 GameManager.Instance를 사용할 수 있습니다. 씬에 두 번째 GameManager가 있으면 자기 자신으로 Instance를 덮어씁니다. Scenes and Levels 챕터에서 이를 방지하는 방법을 알아봅니다.

challenge icon

챌린지

쉬움

싱글턴을 통해 운석이 GameManager에 도달하도록 하세요.

  1. GameManager.cs에서 public static GameManager Instance;를 추가하고 Instance = this;가 포함된 Awake()를 작성하세요.
  2. Meteor.cs에서 game 필드를 삭제하고 대신 GameManager.Instance.MeteorLanded()와 GameManager.Instance.MeteorCaught()를 호출하세요.

‘플레이’를 누르고 운석을 잡으세요. 콘솔에 오류가 없고 Caught: 1이 표시됩니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

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;
    }
}

실제 게임 만들기의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드