zyeon's 작심삼일 코딩 공부
싱글톤 패턴 본문
싱글톤 패턴은 특정 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 디자인 패턴이다.
게임 매니저 처럼 게임 내에서 전역적으로 하나만 존재해야 하는 관리 객체에서 자주 사용한다.
우선 인스턴스는 클래스를 기반으로 실제 메모리에 생성된 객체를 의미한다.
나는 'GameManager' 클래스를 싱글톤 패턴으로 구현하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public int bestScore = 0;
// 클래스의 유일한 인스턴스를 저장하는 정적 변수
private static GameManager _instance;
// 인스턴스에 접근하기 위한 프로퍼티
public static GameManager Instance
{
get
{
// 인스턴스 할당
if (!_instance)
{
_instance = FindObjectOfType<GameManager>();
//찾아도 인스턴스가 존재하지 않음
if (_instance == null)
Debug.Log("no GameManager Singleton obj");
}
return _instance;
}
}
private void Awake()
{
// 씬 전환 시에도 현재 게임오브젝트 삭제안함
if (_instance == null)
{
_instance = this;
DontDestroyOnLoad(gameObject);
}
// 인스턴스가 존재하면 새로 생기는 인스턴스를 삭제
else if (_instance != this)
{
Destroy(gameObject);
}
}
}
static으로 선언된 멤버는 실제로 씬에 존재하지 않더라도 클래스 자체를 통해 접근할 수 있다.
따라서 GameManager를 가진 오브젝트가 없더라도 GameManager.Instance를 호출하면 _instance에 접근 가능하다.
하지만 다른 멤버는 인스턴스가 유효한 상태에서 접근 가능하다.
Instance는 get 접근자를 포함한 static 프로퍼티로, 이를 통해 프로젝트 내의 어느 파일에서나 동일한 인스턴스에 접근하게 된다.
싱글톤 패턴에서 인스턴스는 하나만 존재해야하기 때문에 외부에서 인스턴스를 설정하거나 변경할 수 없다.
따라서 set 접근자는 제공하지 않고 읽기 전용으로 설정되었다.
Awake()는 에서 인스턴스의 존재를 확인하고, 이미 존재한다면 새로 생성된 인스턴스는 Destroy()를 통해 제거된다.
만약 GameManager 스크립트를 가진 오브젝트가 두 개 이상 생성되었더라도, 오브젝트는 하나만 유지된다.
GameManager.Instance.bestScore += 100;
다른 클래스에서 GameManager 인스턴스에 접근하려면 위와 같이 GameManager.Instance를 호출하면 된다.
'unity' 카테고리의 다른 글
2.5D 게임에서 캐릭터 이동 구현 (0) | 2024.08.28 |
---|---|
오브젝트 풀링 (오브젝트 풀 패턴) (0) | 2024.08.24 |
WorldToScreenPoint, ScreenToWorldPoint (0) | 2024.08.20 |
Camera.main 오류 (CS1061) (0) | 2024.08.09 |
C#에서 람다식 (0) | 2024.08.08 |