반응형

오랜만의 포스팅을 싱글톤으로 하게 되었네요.

 

 

일단 제 기준으로 유니티에서 사용하기 편하고 관리하기 쉬운 방법의 싱글톤 예제를 가지고 왔습니다.

 

싱글톤의 역할

싱글톤은 프로그래밍 디자인 패턴 중 추상 객체 인스턴스 생성 패턴 중의 하나로

유니티에서 싱글톤의 역할은

 

1. 게임 시스템에서 전체를 관장하는 스크립트(단일 시스템 자원 관리 차원)

2. 게임 시스템상 전역 변수의 역할을 하는 스크립트

3. 씬 로드시 데이터가 파괴되지 않고 유지

4. 여러 오브젝트가 접근을 해야 하는 스크립트의 역할

5. 단 한개의 객체만 존재(게임 전체를 관장하는 스크립트가 둘 이상 있으면 꼬이겠죠?)

 

등등 많겠지만 결론은 다 같은 말이죠? 네 이 모든 역할을 할 수 있는게 Singleton Pattern입니다.

 

 

아마 새로운 씬을 로드를 하게 되면 앞에 있던 변수들은 전부 파괴되고 새로운 씬이 로드가 될 거예요.

하지만 싱글톤은 씬 이동시 자신을 파괴하지 않으면서 자신이 가진 데이터들 또한 함께 유지한답니다.

 

실습 예제 및 스크립트

씬이 이동되면서 내 골드의 정보가 초기화 되는 것을 알 수 있습니다.

 

위 그림과 같은 경우로

유니티 내에서 씬과 씬 사이를 넘어갈 때 앞의 씬에서 데이터를 받아와서 다음 씬에서 받고 싶을 때 사용할 수 있어요.

 

그럼 MyGold 가 씬이 이동이 되어도 계속해서 유지할 수 있는 방법을 알아볼게요

 

저는 우선 "GameManager"라는 이름의 스크립트를 만들었습니다.

많은 사람들이 GameManager라는 이름으로 스크립트를 사용 하다보니 유니티에서 아이콘을 바꿔주네요.

 

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

public class GameManager : MonoBehaviour
{
    /* // 싱글톤 //
     * instance라는 변수를 static으로 선언을 하여 다른 오브젝트 안의 스크립트에서도 instance를 불러올 수 있게 합니다 
     */
    public static GameManager instance = null; 

    private void Awake()
    {
        if (instance == null) //instance가 null. 즉, 시스템상에 존재하고 있지 않을때
        {
            instance = this; //내자신을 instance로 넣어줍니다.
            DontDestroyOnLoad(gameObject); //OnLoad(씬이 로드 되었을때) 자신을 파괴하지 않고 유지
        }
        else
        {
            if (instance != this) //instance가 내가 아니라면 이미 instance가 하나 존재하고 있다는 의미
                Destroy(this.gameObject); //둘 이상 존재하면 안되는 객체이니 방금 AWake된 자신을 삭제
        }
    }

    //게임 내에서 씬이동시 유지하고 픈 골드 값(변수)
    public int myGold = 0;
}

 위와 같이 스크립트를 짜주시고, 각 씬의 하이라키창에 빈 오브젝트(Empty Object)를 생성해줍니다.

 

이러면 준비 끝!

이제 어디서든

GameManager.instance.(변수 혹은 함수명)

으로 불러 줄 수 가 있게 되었습니다!

 

지금 의 예제로는

GameManager.instance.myGold 라고 불러 줄 수 가 있겠네요.

 

그럼 Main 씬에서 '돈 벌기' 버튼을 눌렀을때 아래가 작동이 되는 스크립트를 만들어주고,

GameManager.instance.myGold += 2;

씬을 이동(상점) 후, 아이템 구매마다 해당하는 가격만큼 myGold가 줄어들게 설정을 하고 테스트를 해보면..

GameManager.instance.myGold -= (아이템가격);

 

씬 이동을 했음에도 'GameManager'가 파괴되지 않아, 'MyGold' 변수 값이 유지가 되는 모습 
플레이 중에 하이라키에서도 씬 이동이 계속 되어짐에도 GameObject(GameManager Componenet가 들어있는)가 지워지지 않고 유지되고 있다.

주의할 점

쉽게 사용이 가능하다보니 되나 가나 모든 데이터,

객체 등을 이곳에 마구잡이로 때려 넣으면 안 된다는 것!!

 

접근이 쉽다보니 막 갖다쓰다보면 비대칭적인 크기로 게임이 만들어지게되고,

나중에 다시 재정리 하려면 이미 꼬일대로 꼬인 상황이 올거에요.

장담합니다 막 갖다쓰다보면 봅니다.

반응형

+ Recent posts