ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 싱글톤 (Singleton Pattern)
    유니티/유니티 코드 2024. 4. 26. 16:27

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

     

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

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

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

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

    5. 단 한개의 객체만 존재

     

    이렇게 5가지의 특성을 지니고 있다

     

    특히 3번 같은 경우 새로운 씬을 로드하더라도

    싱글톤만큼은 다른 변수들처럼 파괴되는것이 아닌 자신이 가진 데이터들을 함께 유지한다

     

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class GameManager : MonoBehaviour
    {
        // 싱글톤 //
       //instance라는 변수를 static으로 선언을 하여 다른 오브젝트 안의 스크립트에서도 instance를 불러올 수 있게 합니다 
        public static GameManager instance = null; 
        
        //게임 내에서 씬이동시 유지하고 픈 골드 값(변수)
        public int myGold = 0;
        //public int mycount = 0; 이런식으로 변수를 추가해도 똑같이 적용된다
    
        private void Awake()
        {
            if (instance == null) //instance가 null. 즉, 시스템상에 존재하고 있지 않을때
            {
                instance = this; //내자신을 instance로 넣어줍니다.
                DontDestroyOnLoad(gameObject); //OnLoad(씬이 로드 되었을때) 자신을 파괴하지 않고 유지
            }
            else
            {
                if (instance != this) //instance가 내가 아니라면 이미 instance가 하나 존재하고 있다는 의미
                    Destroy(this.gameObject); //둘 이상 존재하면 안되는 객체이니 방금 AWake된 자신을 삭제
            }
        }
    }
    출처: https://art-life.tistory.com/130 [무꼬's Art Life:티스토리]

     

    기본적인 예시 코드이다. 이 코드에서는 싱글톤에 대한 데이터들을 담고 있다

    MainScene의 빈 게임오브젝트에 들어갈 예정이다

     

    우선 기본적인 싱글톤 구현은

    public static GameManager instance = null;

    이렇게 이루어지는것을 확인할 수 있다

     

    그 밑에 Awake 메서드에 담긴 정보들은 주석으로 친절하게 설명이 되어있다

    그리고 싱글톤 밑에 mygold라는 변수가 0으로 초기화 되어있는데 이 변수가 씬이 변환되도 값이 유지되길 원한다면

     

     DontDestroyOnLoad(gameObject);

    씬이 로드 되었을때 자신을 파괴하지 않고 유지시켜줘야 한다

     

    왼쪽은 Main Scene, 오른쪽이 Shop Scene

    이해를 위해 임시 씬을 2개 만들어보았다

    왼쪽 MainScene에서는 GetMoney 버튼을 누르면 Gold에 10을 추가하고 Gotoshop을 누르면 shopScene으로 전환한다

    오른쪽 ShopScene에서는 -20을 누르면 골드가 20만큼 감소, -10은 10만큼 감소, GotoMain은 MainScene으로 돌아간다

     

    여기서 중요한건 씬을 양쪽에서 번갈아가며 다녀도 골드값은 0으로 초기화되지 않는다는것이다

     

    using System.Collections;
    using System.Collections.Generic;
    using TMPro;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    public class MainSceneManager : MonoBehaviour
    {
        public TMP_Text Moneyremain;
        public Button Getmoneybtn;
        public Button Gotoshopbtn;
        void Start()
        {
            this.Getmoneybtn.onClick.AddListener(() =>
            {
                GameManager.instance.myGold += 10;
            });
    
            this.Gotoshopbtn.onClick.AddListener(() =>
            {
                SceneManager.LoadScene("Shop Scene");
            });
        }
    
        void Update()
        {
            this.Moneyremain.text = string.Format("Gold : " + GameManager.instance.myGold);
        }
    }

    Main Scene 오브젝트에 들어갈 UI전용 스크립트이다

    실시간으로 버튼을 누를때마다 숫자가 바뀌는 텍스트 출력은 Update안에 넣어주었다

    using System.Collections;
    using System.Collections.Generic;
    using TMPro;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    public class ShopSceneManager : MonoBehaviour
    {
        public Button GotoMain;
        public Button twobtn;
        public Button onebtn;
        public TMP_Text goldremaintxt;
    
        void Start()
        {
            this.GotoMain.onClick.AddListener(() =>
            {
                SceneManager.LoadScene("Main Scene");
            });
    
            this.onebtn.onClick.AddListener(() =>
            {
                GameManager.instance.myGold -= 10;
            });
    
            this.twobtn.onClick.AddListener(() =>
            {
                GameManager.instance.myGold -= 20;
            });
        }
    
        void Update()
        {
            this.goldremaintxt.text = string.Format("Gold : " + GameManager.instance.myGold);
        }
    }

    ShopScene 오브젝트에 들어갈 스크립트이다

     

     

    UI 응용 총정리

    총 4가지를 만들 예정이다 1. 버튼1을 누르면 버튼 3,4를 사라지게 하기 / 버튼2를 누르면 버튼 3,4를 나타나게 하기 2. ShowPopup 버튼을 누르면 Popup상자를 나타나게 하기 / Popup상자에 달린 close버튼을

    sangeun00.tistory.com

    아주 기본적인 UI 내용으로 헷갈린다면 이 글을 참고하자

     

     

     

    결과를 확인해보자. 이제 씬을 변환해도 골드값은 그대로임을 알 수 있다

    '유니티 > 유니티 코드' 카테고리의 다른 글

    Vector3.Reflect  (0) 2024.03.19
    Collision.Contact[]  (0) 2024.03.19
    코루틴 (Coroutine)  (1) 2024.02.14
    foreach  (0) 2024.02.14
    딕셔너리 (Dictionary)  (0) 2024.02.13
Designed by Tistory.