[Unity] Dungeon Gunner (22) - Singleton Abstract Class

suhan0304·2024년 2월 11일
0

유니티 - Dungeon Gunner

목록 보기
22/30
post-thumbnail

Singleton

게임 관리자를 위해 쉽게 사용가능한 싱글톤 인스턴스를 만들기 위해 사용 가능한 추상 클래스를 만들어보자. 싱글톤이 게임 개발에 있어서 적절한 디자인 패턴인지에 대해서는 의견이 많지만 소규모 팀의 경우에는 싱글톤으로 얻을 수 있는 것이 잃을 수 있는 것보다 많기 때문에 적합하다고 생각한다. 싱글톤은 쉽게 말해 전역적으로 액세스 가능하게 코드 전체에 종속성을 생성하느 것이다.

SingletonMonoBehavior.cs

using UnityEngine;

public abstract class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;

    public static T Instance
    {
        get
        {
            return instance;
        }
    }

    protected virtual void Awake()
    {
        if (instance == null)
        {
            instance = this as T;
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

---예를 들면 아래와 같은 두 스크립트가 있고 두 오브젝트가 있다고 하자.

TestGameManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestGameManager : SingletonMonoBehaviour<TestGameManager>
{
    public void TestMethod()
    {
        Debug.Log("Test Method Called");
    }
}

TestOtherComponent.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestOtherComponent : MonoBehaviour
{
    private void Start()
    {
        TestGameManager.Instance.TestMethod();
    }
}

이러면 TestGameManager 오브젝트의 TestGameManager 스크립트가 실행되면서 SingletonMonoBehaviour의 TestGameManager 타입으로 인스턴스가 생성된다. 그러면 TestObject에서 TestOtherComponent의 TestGameManager.Instance.TestMethod();가 실행되면서 TestGameManager 인스턴스의 TestMethod가 실행되 log가 출력된다.

만약에 TestGameManager가 여러 개면 싱글톤으로 여러개의 인스턴스가 생성되게 되지만 Destory가 해당 오브젝트를 파괴시켜 싱글톤 중복을 방지시켜준다. 예를 들어 TestGameManager가 10개 있을 때 실행시키면 아래와 같다.

아래와 같이 GameManager를 Destroy 해서 하나의 싱글톤 오브젝트만 남는 것을 확인할 수 있다.

이를 통해 인스턴스가 이미 있으면 해당 인스턴스를 파괴시켜서 항상 하나의 싱글톤만 존재할 수 있도록 한다.

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글