제네릭 싱글턴
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 34번째.
섹션 3의 싱글턴은 모든 매니저가 반복해서 작성하는 다섯 줄입니다. static Instance, 이를 설정하는 Awake, 중복 확인입니다. 제네릭 기본 클래스는 이 코드를 한 번만 작성합니다. 각 매니저는 자신을 타입으로 지정해 이 클래스를 상속합니다:
public abstract class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
public static T Instance { get; private set; }
protected virtual void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this as T;
}
}
public class ScoreManager : Singleton<ScoreManager>
{
public int score;
public void Add(int points) { score += points; }
}
public class SoundManager : Singleton<SoundManager>
{
public void Play(string clip) { Debug.Log("Playing " + clip); }
}// 어떤 스크립트에서든
ScoreManager.Instance.Add(10);
SoundManager.Instance.Play("coin");제네릭 클래스의 static 멤버는 해당 클래스로 만들어진 각 타입에 속합니다. Singleton<ScoreManager>와 Singleton<SoundManager>는 각각 Instance를 가진 두 개의 타입이므로, 매니저들은 Instance를 공유하지 않습니다. ScoreManager.Instance는 이미 ScoreManager 타입이며, 이것이 T를 사용하는 이유입니다. 기본 클래스 안에서 this는 Singleton<T>로만 알려져 있으므로, this as T를 사용해 실제 매니저 타입으로 넘깁니다.
기본 클래스는 abstract입니다. Unity는 매니저만 오브젝트에 추가합니다. 자체 Awake가 필요한 매니저는 일반적인 void Awake()를 작성해서는 안 됩니다. 이렇게 하면 기본 클래스의 메서드를 숨기고(컴파일러가 경고합니다), Unity는 매니저의 메서드만 호출하므로 Instance가 설정되지 않습니다. 이를 재정의하고 먼저 기본 메서드를 호출하세요:
protected override void Awake()
{
base.Awake();
score = 0;
}챌린지
중급보라색 포털로 연결된 마을과 숲입니다. 각 장면에는 자체 Wallet 객체와 MusicPlayer 객체가 있으므로, 각각 독립적으로 작동하고 코인은 Wallet.Instance.Add(1)을 호출합니다. 현재 두 매니저는 섹션 3의 싱글턴이므로, 장면을 불러올 때마다 지갑이 빈 지갑으로 바뀝니다. 두 매니저 모두 장면을 불러와도 유지되는 제네릭 기반 클래스를 사용하도록 하세요.
PersistentSingleton.cs에서public abstract class PersistentSingleton<T>를 작성하세요. 모든 MonoBehaviour 형식 T에 사용할 수 있는 MonoBehaviour이며, 클래스만 설정할 수 있는 T 형식의 public staticInstance와protected virtual void Awake()를 포함합니다.- 이 클래스의 Awake는 같은 종류의 첫 번째 객체를 유지합니다. 첫 번째 객체가 Instance가 되고 장면을 불러와도 살아남습니다. 이후 생성되는 객체는 자신의 객체를 파괴하고 아무것도 변경하지 않습니다.
Wallet과MusicPlayer는 이 클래스를 상속하고, 각자 가지고 있던Instance필드는 제거합니다.MusicPlayer는Now playing: Adventure를 기록하는 자체 Awake를 유지합니다. 이 메서드는 기반 클래스의 Awake 다음에 실행되어야 하며, 남아 있는 객체에서만 실행되어야 음악이 게임당 한 번만 시작됩니다.
화살표 키로 Player를 이동합니다. Play를 누르고, 코인을 획득한 다음 숲에 갔다가 돌아와 Check를 누르세요.
직접 해보기
using UnityEngine;
// PersistentSingleton<T>: 씬을 불러와도 유지되는 단일 인스턴스
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.