-
싱글톤 (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);
씬이 로드 되었을때 자신을 파괴하지 않고 유지시켜줘야 한다
이해를 위해 임시 씬을 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 내용으로 헷갈린다면 이 글을 참고하자
결과를 확인해보자. 이제 씬을 변환해도 골드값은 그대로임을 알 수 있다
'유니티 > 유니티 코드' 카테고리의 다른 글
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