일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 애드몹
- UGUI
- Admob
- LINQ
- 애니메이션
- csvhelper
- React Native
- 프로그래머스
- enum
- cs
- 게임개발
- unity3D
- 열거형
- canvasgroup
- climbingtheleaderboard
- ui
- 광고테스트
- 컴퓨터구조
- Hackerrank
- 랜덤
- 코딩테스트
- C#
- 전면광고
- http
- 유니티
- scrollrect
- dotween
- 모션
- 유니티기초
- unity
- Today
- Total
Ruya Games
유니티에서 싱글턴 디자인패턴 깔끔하게 구현하기 본문
싱글턴 패턴은 유니티에서 구현할 수 있는 가장 쉬운 패턴이고, 유니티의 코딩 모델에 거의 완벽히 맞는 패턴이면서도,
구성 요소간의 결합도를 높히기 때문에 항상 적절하게 사용해야 합니다.
싱글턴(Singleton) 패턴이란?
특정 인스턴스에 대해 런타임 동안 메모리 내에 오직 하나의 인스턴스만 존재하도록 허용하는 패턴입니다.
만약 자기 자신과 같은 유형의 개체 인스턴스를 발견한다면 없애버립니다.
장점 | 단점 |
전역 접근 가능 : 싱글턴 패턴을 사용하면 모든 리소스나 서비스에서 전역적으로 접근할 수 있는 지점을 만들 수 있음. | 유닛 테스트의 어려움 발생 : 싱글턴 오브젝트끼리의 종속이 발생하거나, 결합도가 높아짐에 따른 문제 발생. |
동시성 제어 : 공유 자원의 동시 접근을 제한할 수 있음. | 만능 : 모든 것을 싱글턴으로 해결하려는 코딩 습관이 생길 수 있음. |
위와같은 장단점이 있는데, 배우기 쉽고 사용하기 편한것은 사실입니다.
그럼 아래는 싱글턴 패턴을 따르는 클래스를 만드는 방법입니다.
여러 싱글턴 클래스들을 만들때 용이하도록 제네릭 클래스로 작성합니다.
using UnityEngine;
public class Singleton <T> : MonoBehaviour where T : Component {
private static T _instance;
public static T Instance {
get {
if (_instance == null) {
_instance = FindObjectOfType<T>();
if (_instance == null) {
GameObject obj = new GameObject();
obj.name = typeof(T).Name;
_instance = obj.AddComponent<T>();
}
}
return _instance;
}
}
public void Awake() {
if (_instance == null) {
_instance = this as T;
DontDestroyOnLoad(gameObject);
} else {
Destroy(gameObject);
}
}
}
위의 Singleton 클래스는 싱글턴 방식으로 동작합니다.
클래스의 Instance를 받아오려고 할때, 현재 다른 인스턴스가 없는지 확인한 뒤 다른 인스턴스가 없다면
새로운 GameObject를 생성해서 T 컴포넌트를 추가합니다.
Singleton 클래스는 Awake에서 메모리상에 초기화되어있는 본인과 동일한 인스턴스가 있는지 확인합니다.
동일한 인스턴스가 메모리상에 없다면 본인을 _instance에 할당하고, DontDestroyOnLoad(gameObject)를 통해 새로운 Scene이 로드되어도 이 오브젝트가 사라지지 않도록 합니다.
이미 메모리에 존재한다면 Destroy(gameObject)를 통해 스스로를 제거합니다.
이제 위의 클래스를 통해 GameManager 클래스를 싱글턴 방식으로 동작하도록 해보겠습니다.
임의의 GameManager가 아래와 같이 작성되있다고 가정한다면,
public class GameManager : MonoBehaviour {
...
}
GameManager가 MonoBehaviour가 아닌 Singleton<GameManager> 클래스를 상속받도록 변경해줍니다.
public class GameManager : Singleton<GameManager> {
...
}
그럼 GamaManager는 이제 싱글턴 방식으로 동작하게 됩니다.
'Unity' 카테고리의 다른 글
유니티 스크립트 실행 순서 설정하기 (0) | 2024.05.20 |
---|---|
유니티 공식 오브젝트 풀링 API 사용법 - 1 (0) | 2024.01.01 |
[DoTween] Ease 곡선 종류 & 애니메이션 확인 사이트 (2) | 2023.12.08 |
UnityWebRequest로 PATCH 사용하기 (1) | 2023.12.08 |
유니티에서 텍스트 타이핑 대사박스 효과 구현하기 (1) | 2023.12.07 |