[Unity Manager]Managers 만들기

dd_ddong·2022년 5월 16일
0

Managers

게임을 만들때 전역변수로 사용하며 UI, 네트워크, 사운드, Scene관리 등의 기능을 넣어줄 managers가 필요하다. 다른 매니저들을 포함해야하기에 s.

Singleton

game manager는 scene에 한개만 존재해야 하므로 singleton pattern을 이용해 구현해줘야 한다.

일단 빈 게임오브젝트를 생성해주고 이름을 @Manager라고 지어준다.

Managers Script를 만들어 컴포넌트에 추가해준다.

instance 변수

public class Managers : MonoBehavior
{
	void Start()
    {
    }
    void Update()
    {
    }
}

기본 C# 스크립트 코드이다. 여기서 singleton 적용을 위해 static한정자의 Managers 타입의 intance 변수를 생성해준다.

public class Managers : MonoBehavior
{
	static Managers instance;
    public static Managers GetInstance() { return instance; }
	void Start()
    {
    }
    void Update()
    {
    }
}

앞으로 다른 클래스에서 Managers에 접근하려면 GetInstance()를 사용하도록 한다.


Init()

처음 Manager를 생성하거나 접근할 때마다 하나의 instance에만 접근하도록 하자
일단 manager가 없으면 만들어서, 있으면 있는걸로 초기화 시켜주는 init() 메소드를 만든다.

public class Managers : MonoBehavior
{
	static Managers instance;
    public static Managers GetInstance() { return instance; }
	void Start()
    {
    }
    void Update()
    {
    }
    void Init()
    {
    	if(instance == null)
        {
        	//@Managers 가 존재하는지 확인
        	GameObject go = GameObject.Find("@Managers");
            //없으면 생성
            if(go == null)
            {
            	go = new GameObject { name = "@Managers" };
            }
            if(go.GetComponent<Managers>() == null)
            {
            	go.AddComponent<Managers>();
            }
            //없어지지 않도록 해줌
            DontDestroyOnLoad(go);
            //instance 할당
            instance = go.GetComponent<Managers>();
        }
            
}

Init()을 호출하는 경우는

  1. @Managers가 생성되었을 때
  2. GetInstance()가 호출되었을 때 -> null확인을 해야되니까

따라서 코드는

public class Managers : MonoBehavior
{
	static Managers instance;
    public static Managers GetInstance() { Init(); return instance; }
	void Start()
    {
    	Init();
    }
    void Update()
    {
    }
    void Init()
    {
    	if(instance == null)
        {
        	//@Managers 가 존재하는지 확인
        	GameObject go = GameObject.Find("@Managers");
            //없으면 생성
            if(go == null)
            {
            	go = new GameObject { name = "@Managers" };
            }
            if(go.GetComponent<Managers>() == null)
            {
            	go.AddComponent<Managers>();
            }
            //없어지지 않도록 해줌
            DontDestroyOnLoad(go);
            //instance 할당
            instance = go.GetComponent<Managers>();
        }
            
}

이렇게 된다.
만약 다른 Object에서 Manager를 사용한다면

public class Player : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Managers mg = Managers.GetInstance();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

0개의 댓글