새소식

⇥ 2D Game/Unity

Unity 게임 만들기 프로젝트 - Manager 만들기 (singleton 패턴)

  • -
반응형

1. Component

Unity 엔진에서 사용하는 부품, Monobehavior 를 상속 받는 코드 ( Object -> component -> Monobehavior)
상속을 받아야 유니티가 GameObject 로 인식, Component 의 기능 ( start, update 등 ) 을 사용할 수 있다.

 

2. Manager

- 게임에서 항상 존재하며 전체적인 정보를 관리할 수 있는 오브젝트가 필요, 여러개가 뜨면 정보가 혼란스러울 수 있으니 한개의 인스턴스만 존재해야함 -> 싱글톤 패턴의 필요성
- Monobehavior 는 new 로 새로 할당받아 오브젝트를 생성할 수 없음 object를 상속받은 유니티 객체이기 때문에 new 불가
- 일반적인 C# 코드로 설계하면 monobehavior 를 제거해야 하지만 컴포넌트로 사용하기 어려움 -> 초기화를 할 수 없음
- 게임오브젝트로 생성 -> @Manager 스크립트 생성 후 해당 오브젝트에 스크립트로 붙여서 불러옴 (@ 는 컨벤션)
- @Manager 에서는 Init 함수를 이용하여 싱글톤 패턴 사용, 하나의 인스턴스만 가지도록 함

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

public class Managers : MonoBehaviour
{
    static Managers s_instance;
    public static Managers Instance { get { Init(); return s_instance;} }
    // Start is called before the first frame update
    void Start()
    {
        Init();
    }

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

    static void Init()
    {
        if (s_instance == null)
        {
            GameObject go = GameObject.Find("@Managers");
            if (go == null)
            {
                go = new GameObject { name = "@Managers"};
                go.AddComponent<Managers>();
            }

            DontDestroyOnLoad(go);
            s_instance = go.GetComponent<Managers>();
        }
    }
}

Managers 라는 s_instance 오브젝트 선언, 호출 시 Init 함수로 진입, 존재한다면 존재하는 인스턴스 리턴, 없다면 생성하여 리턴
따라서 s_instance 는 한개의 인스턴스만 존재할 수 있음

 

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

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

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

다른 Script 에서 매니저 인스턴스를 불러올 때는 단순히 Managers.Instance 를 사용하여 호출

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.