싱글톤 : 프로그래밍 디자인 패턴 중 추상 객체 인스턴스 생성 패턴중의 하나로
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 응용 총정리
총 4가지를 만들 예정이다 1. 버튼1을 누르면 버튼 3,4를 사라지게 하기 / 버튼2를 누르면 버튼 3,4를 나타나게 하기 2. ShowPopup 버튼을 누르면 Popup상자를 나타나게 하기 / Popup상자에 달린 close버튼을
sangeun00.tistory.com
아주 기본적인 UI 내용으로 헷갈린다면 이 글을 참고하자
결과를 확인해보자. 이제 씬을 변환해도 골드값은 그대로임을 알 수 있다
'유니티 > 유니티 관련 용어' 카테고리의 다른 글
Canvas RenderMode 정리 (0) | 2025.04.02 |
---|---|
Vector3.Reflect (0) | 2024.03.19 |
Collision.Contact[] (0) | 2024.03.19 |
글로벌 좌표 / 로컬 좌표 / Transform.Translate (0) | 2024.03.12 |
Shader, Rendering Pipeline (0) | 2024.02.18 |