Unity3D에서 싱글톤(Singleton) 패턴 사용하기


이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다.

singleton

유니티에서 싱글톤 패턴 사용하기

게임을 만들다 보면 각 오브젝트 및 데이터를 관리하는 매니져 클래스 / 오브젝트를 만들어서 관리하게 됩니다.

이렇게 관리되는 데이터들은 다른 오브젝트에서도 접근이 가능해야 하는 경우가 많은데, 컴포넌트 기반 엔진인 유니티에서는 접근이 용이하지 만은 않습니다.

함수들은 SendMessage를 이용해서 접근이 가능하지만, 변수 등에 접근하려고 할 때는 곤란한 경우가 많습니다.

이럴 때 사용하면 좋은 패턴이 Singleton(싱글톤) 패턴입니다.

다른 오브젝트도 매니져 클래스에서 public으로 선언된 것에 대해서는 직접 접근이 가능합니다. 변수, 함수 모두 가능합니다.

예제 코드를 보며 확인해보겠습니다.

Singleton을 구현하는 방법은 정말 많습니다. C#에서만 사용되는 기술이 아니라서 다른언어에서도 많이 사용되고 있는 보편적인 패턴이라고 할 수 있습니다.

아래 예제 코드는 그 중에서도 제가 주로 사용하는 코드 형태입니다.

using UnityEngine;
using System.Collections;

public class ManagerClass : MonoBehaviour
{
    private static ManagerClass _instance = null;

    public static ManagerClass Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType(typeof(ManagerClass)) as ManagerClass;

                if (_instance == null)
                {
                    Debug.LogError("There's no active ManagerClass object");
                }
            }

            return _instance;
        }
    }
}

코드를 살펴보면, 먼저 자기 자신 type의 (여기서는 ManagerClass 타입) private 형 static 변수를 갖습니다.

그리고 외부에서 접근할 수 있도록 프로퍼티를 public으로 선언하고 접근할 때 _instance가 null이면 FindObjectOfType 함수를 이용해서 씬 내에 있는 ManagerClass 오브젝트를 찾습니다.

검색을 해보고 검색에 성공한 경우 그 값을 반환하고, 검색에 실패하면 오류를 발생하도록 구현을 했습니다.

FindObjectOfType 함수는 유니티에서 비용이 큰 함수 중 하나지만, 잘 살펴보시면 아시겠지만, 처음 한번만 호출됩니다.

이제 ManagerClass에 아래와 같이 간단한 함수를 public으로 선언을 하고 접근을 해보겠습니다.

public void TestFunc()
{
    Debug.Log("TestFunc() Called");
}

외부에서 접근을 할 때는 ManagerClass.Instance.TestFunc()와 같은 방식으로 합니다.

이렇게 하면 SendMessage를 사용하지 않고 바로 함수에 접근이 가능합니다. 변수도 마찬가지 입니다. ManagerClass.Instance.변수이름 이렇게 접근하면, public으로 선언된 변수, 프로퍼티는 모두 접근할 수 있습니다.

테스트를 해보겠습니다.

먼저 ManagerClass 스크립트를 갖는 게임 오브젝트를 하나 생성합니다. 게임 오브젝트 이름은 GameManager 라고 지정했습니다.

1

그리고 ManagerClass의 TextFunc() 함수에 접근하는 클래스를 생성합니다.

아래 스크립트처럼 간단히 Start 함수에서 호출하도록 했습니다.

using UnityEngine;
using System.Collections;

public class TestClass : MonoBehaviour
{
    void Start()
    {
        ManagerClass.Instance.TestFunc();
    }
}

그런뒤 아래 그림처럼 이 스크립트를 갖는 게임 오브젝트도 생성합니다.

2

이제 실행을 하고 결과를 살펴보겠습니다.

3

위에 보는 것과 같이 호출이 잘 되는 것을 확인할 수 있습니다.

게임을 만들다가 매니져(관리자) 클래스가 필요한 경우 Singleton 패턴을 사용하면 이처럼 편리하게 접근이 가능합니다.

 

내용 끝까지 읽어주셔서 감사합니다.

배너 클릭은 저에게 많은 힘이 됩니다.

감사합니다 🙂

 

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, 웹 개발, 1인 기업, 독서, 책쓰기에 관심이 많습니다.

6 Responses

  1. ㅁㅈㅈ 말해보세요:

    감사합니다~! 싱글톤 사용에 도움이 됐습니다!

  2. inhaP 말해보세요:

    정말 감사합니다 이해하기 쉽게 써놓으셔서 보고 한방에 이해가 됐어요.. 앞으로도 많은 활동 부탁드립니다!

  3. 셀이다 말해보세요:

    감사합니다.
    1방문 1배너클릭 하고있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다