[Unity] 반복되는 싱글톤 코드 통합 처리하기

Arthur·2023년 10월 5일
0
post-thumbnail
post-custom-banner

반복되는 싱글톤 코드에 대한 고민


유니티 게임 팀 프로젝트를 진행하던 중 Manager들은 싱글톤을 처리 하는 경우가 많았습니다.
그런데 팀원마다 담당한 파트가 다르고 각자의 스타일로 싱글톤 코드를 작성해서 진행했습니다.

그러던 중 반복적으로 작성하는 싱글톤 코드를 통합 시켜 처리할 방법은 없을까 고민했습니다.

그 결과 싱글톤을 제네릭 클래스로 만들어 상속 받아서 사용하는 방법을 찾게 됩니다.



싱글톤 제네릭 클래스


using UnityEngine;

public class CustomSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T m_Instance;


    public static T Instance
    {
        get
        {
            if (m_Instance == null)
            {
                m_Instance = (T)FindObjectOfType(typeof(T));

               if (m_Instance == null)
                {
                    GameObject singletonObject = new GameObject { name = "@" + typeof(T).ToString() };
                    m_Instance = singletonObject.AddComponent<T>();

                    DontDestroyOnLoad(singletonObject);
                }
            }

            return m_Instance;
        }
    }
}

위 싱글톤 코드의 특징을 정리해봤습니다.

  • GameObject.Find()를 사용해서 게임 오브젝트를 찾는 것들이 많은데, Find() 함수는 문제가 많아서 FindObjectType()을 사용했습니다.
    • GameObject.Find()를 사용하면 안되는 이유에 대해 정리한 글 => 링크
  • DontDestroyOnLoad()를 사용해서 다른 씬으로 넘어가도 게임 오브젝트가 파괴되지 않도록 했습니다.
  • MonoBehaviour를 상속받고 제네릭 클래스 사용했습니다.
    • C#은 다중 상속이 안되기 때문에 MonoBehaviour를 싱글톤 제네릭 클래스에서 상속을 받습니다.

Manager에 적용한 예시

public class GameManager : CustomSingleton<GameManager>
{

   private void Awake()
    {
    	// ....
    }
    
    private void Update()
    {
     	// ....  
    }   
}

사용 방법은 상당히 간단합니다.
구현해 놓은 제네릭 싱글톤 클래스를 상속 받고, 싱글톤 클래스명을 제네릭 T에 적으면 됩니다.

제네릭 싱글톤 코드에서 T 라고 적혀 있는 부분은 제네릭 문법에서 사용하는 방법입니다.



작성하면서 느낀 점


프로젝트를 진행하면서 다른 팀원들도 잘 활용하고 유용했던 싱글톤 처리 방법이였습니다.

하지만 우려되는 점은 누군가 싱글톤 제네릭 클래스를 수정하면, 상속 받은 모든 클래스에 영향을 줄 수 있는다는 점입니다.

그리고 어떤 제네릭 싱글톤 클래스를 보면 동시성 이슈를 방지하기 위해 Lock을 사용한 코드도 봤습니다.

기존 제네릭 싱글톤 클래스를 변경을 하지 않더라도 또 다른 제네릭 싱글톤 클래스를 만들면 그것 또한 문제가 될 것 같습니다.

이런 문제를 방지하기 위해 팀원과 사전에 소통을 하고 규칙을 정하거나 수정을 못하게 하는 방법도 고안해야 겠다고 생각했습니다.



참고 자료


  • Unity Singleton을 제네릭으로 만들어놓고 써봅시다. => 링크
  • [Unity] C# MonoBehaviour Singleton 유니티 싱글톤 만드는 방법 => 링크
  • csharpstudy.com - C# 제네릭 (C# Generics) => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.
post-custom-banner

0개의 댓글