유니티에서 싱글톤 패턴 구현하기 | 유니티

  Рет қаралды 11,440

WER's GAME DEVELOP YOUTUBE

WER's GAME DEVELOP YOUTUBE

Күн бұрын

프로그래밍 패턴 중에서 싱글톤 패턴을 유니티 엔진에서 구현하는 방법을 알아봅시다.
타임라인
0:00 인트로
0:43 - 일반적인 C#에서의 싱글턴 패턴
1:29 - 유니티 엔진에서의 싱글턴 패턴
4:18 - 일반 C#과 유니티 스크립트의 싱글턴 패턴의 차이점 1
4:54 - 일반 C#과 유니티 스크립트의 싱글턴 패턴의 차이점 2
5:53 - 일반 C#과 유니티 스크립트의 싱글턴 패턴의 차이점 3
6:16 - 싱글톤 패턴의 장점
6:37 - 싱글톤 패턴의 단점 및 주의점
본 영상의 오프닝은 비디오몬스터를 이용해서 만들어졌습니다.
videomonster.com/
[유니티 어필리에이트 프로그램]
아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.
- 유니티 에셋스토어 : prf.hn/l/vJl41D5
- 유니티 플러스 : prf.hn/l/wLNyJZG
- 유니티 프로 : prf.hn/l/qXOybmp
[투네이션]
toon.at/donate/63773521276146...
[Patreon]
/ wergamedevchan
#Unity #유니티 #유니티엔진 #게임만들기 #게임엔진 #베르 #베르의프로그래밍노트 #싱글톤 #싱글턴
#Singleton #패턴 #Pattern

Пікірлер: 47
@user-ti6vp3zt9f
@user-ti6vp3zt9f 4 жыл бұрын
좋은 정보 감사합니다. 아는 한도 내에서 몇 가지 덧붙여 보려 합니다. 1. Awake에서 들어가는 싱글턴 중복 체크는 에디터에서만 Destroy 시키도록 하고 Assert 나 Debug.LogError 통해서 잘못 사용되고 있는 곳이 있음을 throw 해서 원천적으로 2번 생성되는 일을 막도록 하는것이 바람직합니다. 라이브에서 Awake에 들어가는 FindObjectsOfType의 사용은 가급적 지양하는것이 좋습니다. 2. 유니티에 새 기능으로 추가된 Fast Enter PlayMode에서는 기존과 같이 동작하는 Mono Singleton의 static 필드가 초기화되지 않으므로 문제가 발생할 것입니다. [RuntimeInitializeOnLoad] 어트리뷰트를 이용해 static 필드들을 null로 바꿔주는 콜백메서드를 하나 정의해두면 해결됩니다. 3. 모노 싱글턴은 Generic 하게 생성해두고 상속받아 사용하면 편리합니다. 다만 deploy 전에는 보안상 상속관계를 없애준 뒤 난독화하여 배포하는것이 좋습니다. 싱글턴 클래스들은 대체로 중요한 역할을 하기 때문에 부모클래스가 파악되어버리면 보안상 허점이 비교적 쉽게 드러날 수도 있습니다.
@wergia
@wergia 4 жыл бұрын
싱글톤 패턴을 사용할 때 주의해야할 좋은 내용이네요!
@namespace_
@namespace_ Жыл бұрын
오른쪽아래 시간을보면 이 짧은강의 하나찍는데도 소요시간이 많군요.. 노고에 감사드립니다
@bbkk4621
@bbkk4621 4 жыл бұрын
블로그도 잘 보고있었는데 유튜브도 하셨군요~! 너무 헷갈렸던 부분이었는데 이해됐어요 감사합니다!!
@wergia
@wergia 4 жыл бұрын
시작한지 얼마 안됐어요 ㅎㅎ
@user-lq8xj8es3c
@user-lq8xj8es3c 6 ай бұрын
좋은 설명입니다. 이제좀 이해가 되네요
@greatyisoon-sin3402
@greatyisoon-sin3402 4 жыл бұрын
싱글톤에 대한 간단명료한 강의 잘봤습니다. 오브젝트 폴링이라는것에 대한 영상도 한번 다뤄주세요
@wergia
@wergia 4 жыл бұрын
부족한 설명 열심히 들어주셔서 감사합니다! 오브젝트 풀링 기법 구현도 계획 중에 있습니다. 리퀘스트가 있으니 다다음편 정도에 다뤄보도록 하겠습니다!
@GhostknifeKR
@GhostknifeKR 3 жыл бұрын
최근에 bolt에 관심이 생겨서 이것저것 만져보면서 채널 잘보고 있습니다. 혹시 bolt로는 싱글톤을 어떻게 구현해야할지 생각해보셨나요? 그냥 편하게 직접 스크립트를 작성해버리면 그만이지만 bolt에서 그런 구현이 가능한지 궁금하네요..
@wergia
@wergia 3 жыл бұрын
해봐야 확실히 알겠지만 비슷한 형태로는 구현할 수 있을 것 같아요! 싱글톤 조건인 Instance를 하나만 허용할 것. Instance에 대한 쉬운 접근 방법을 제공할 것 정도만 신경쓰면 될 것 같네요.
@devSSEM
@devSSEM 4 жыл бұрын
좋은 내용 올려주셔서 감사합니다! 이런 꼭 알아야하는 프로그래밍 패턴들을 더 알고 싶은데 혹시 추천하시는 책이 있을까요?ㅠ
@wergia
@wergia 4 жыл бұрын
꼭 알아야 하는 패턴이라기보다는 추천드리는 프로그래밍 패턴 책으로는 좀 더 프로그래밍 방향으로는 "GoF의 디자인 패턴"이라는 책이 있고 게임 쪽으로는 "게임 프로그래밍 패턴"이라는 책이 볼만한 것 같습니다.
@devSSEM
@devSSEM 4 жыл бұрын
@@wergia 감사합니다!^^
@CodeBlues-
@CodeBlues- 3 жыл бұрын
보통 캔버스쪽의 텍스트, 이미지 컴포넌트들을 UIManager오브젝트를 만들고 거기에 UIManager스크립트를 붙이고 참조를 하나하나 연결해서 쓰는 식으로 작업을 합니다. 물론 스크립트엔 요번 강의해주신 그대로 싱글톤을 썼어요. 그런데 게임을 하다가 타이틀로 돌아오면(씬로드 함), UIManager컴포넌트의 모든 참조들이 끊어져 있고 죄다 Missing..이더군요. 제가 오해한게 저 참조들도 안끊어질 줄 알았는데, 실상은 그게 아니더라구요. 안끊어지게 하려면 캔버스에 있는 오브젝트들에 스크립트로 Dont..를 붙여줘야 하는데, 현실적으로 Dont..는 최상단만 허용해서 애초에 불가능하더라구요... 이런 경우 방법이 있을까요? DontDestroyOnLoad()함수가 만능인줄 알았는데 참조가 깨지는걸 보니 제가 오해를 했었네요..-0-;;
@wergia
@wergia 3 жыл бұрын
UI 쪽 설계가 좀 많이 어렵죠. UIManager 클래스를 싱글톤으로 쓰면서 UIManager 오브젝트 하위에 속하지 않는 UI 오브젝트들을 참조하는 방식으로 사용하면 여러 씬을 오갈 때 참조가 끊어지는 일이 쉽게 발생합니다. 참조가 끊어지는 일이 발생하지 않게 하려면 여러 가지 방법이 있겠지만, 각 씬마다 사용하는 별도의 씬 UI 매니저를 만들어서 DontDestoryObject를 사용하지 않고 그 씬에서만 사용하는 방법도 있고, 다른 방법으로는 UIManager는 그대로 씬을 이동하도록 설계하되 각 UI를 직접 참조하는게 아니라 각 UI를 참조해서 기능을 호출해주는 별도의 오브젝트를 만들어서 씬에 진입하면 그 오브젝트를 UIManager가 찾아서 캐싱하는 방식으로 사용하는게 좋을 듯 하네요.
@CodeBlues-
@CodeBlues- 3 жыл бұрын
@@wergia 검색을 해봐도 마지막 말씀하신 방법을 제일 많이 쓰는 것 같네요. 조그만 게임들만 만들어서 몰랐었는데, 설계 진짜 잘해야겠어요. 조언 감사합니다.(_ _)
@wergia
@wergia 3 жыл бұрын
@@CodeBlues- 저도 항상 설계가 어려운 것같아요 ㅎㅎ
@reald7163
@reald7163 3 жыл бұрын
설명을 차근차근 잘 하시네요 많은 도움이 되고 있습니다. 근데 싱글톤 디버깅하다가 질문이 한가지 생겨서 여쭤볼게요 상황이 씬에 싱글톤 스크립트를 붙인 오브젝트가 없는 상태에서 싱글톤의 인스턴스를 최초로 호출하는 오브젝트를 하나 만들어 둔 상태로 싱글톤의 인스턴스 프로퍼티 get 부분에 디버깅포인트를 걸어뒀는데 if(instnace == null) 이 안으로 들어가는 경우가 없더라고요 확인해보니 인스턴스에 이미 "New Game Object(SingletonComponent)" 이렇게 할당이 되어있어서 그냥 바로 instance값을 리턴하고 문제없이 동작하던데 최초 할당이 왜 이미 되어있는건지 혹시 알려주실 수 있을까요?
@wergia
@wergia 3 жыл бұрын
만약 씬에 미리 싱글톤 오브젝트가 배치되어 있지 않은 상태라면 싱글톤 오브젝트를 생성하도록 만들기 위해서 입니다.
@reald7163
@reald7163 3 жыл бұрын
@@wergia 답글감사합니다! 그런데 말씀주신대로라면 어째든 한번은 저 null일때 조건문에 들어가서 addComponent를 한번은 해야하는거아닌가요 ㅠ 궁금해서 get프로퍼티 할당 부분을 주석걸고 디버깅하니까 당연히라고해야할지 null이나오는걸보면 제가 인스턴스 호출전에 한번 이미 어딘가에서 불러주는것같은데..엔진코드를 볼수없으니 이런상황이 답답하네요 ㅠ 알고계신게있다면 가르침을 부탁드립니다 ㅠ
@wergia
@wergia 3 жыл бұрын
@@reald7163 진용님 말씀대로 if문으로 null 체크를 해주는게 맞습니다. 강좌에서는 그냥 빠르게 코딩하기 위해 생략했습니다.
@user-ss3lg1xz5k
@user-ss3lg1xz5k 2 жыл бұрын
public class SingletonGOB : MonoBehaviour where T : SingletonGOB 와 같이 싱글톤 클래스를 생성하는 코드에 대해 질문이 있습니다. where T : MonoBehaviour 로 하는건 이해가 되는데 위처럼 재귀와 같은 형태로 제약조건을 거는 이유는 무엇인가요? 어떤분은 재귀적 타입 바운드라고 하던데 도저히 이해가 안가서 질문드립니다.
@wergia
@wergia 2 жыл бұрын
음 저도 재귀적 타입 바운드를 사용해본적이 없어서 답변을 드리기가 어렵네요 ㅜㅜ
@bbkk4621
@bbkk4621 4 жыл бұрын
궁금한게 있는데 일반 c#에서 기본생성자가 자동으로 구현되니까 실제로는 저렇게 따로 코드를 작성하지 않아도 되는건가요??
@wergia
@wergia 4 жыл бұрын
일반 C#에서는 기본생성자를 사용하지 못하게 private으로 막아야 합니다. 하지만 유니티 C#에서는 모노비헤이비어를 상속 받는 클래스가 인스턴스화되는 과정을 그것으로 막을 수 없기 때문에 Start나 Awake에서 검사해서 막아야합니다.
@bbkk4621
@bbkk4621 4 жыл бұрын
@@wergia 아!!! ㅋㅋㅋㅋ이해됐어요 감사합니다
@user-lm3qr3wt5k
@user-lm3qr3wt5k 4 жыл бұрын
저 싱글톤 스크립트를 사용하려면 씬 내의 오브젝트중에 어디다가 부착해야되나요..?
@wergia
@wergia 4 жыл бұрын
원하는 오브젝트에 부착하시면 됩니다.
@upzerg
@upzerg 2 жыл бұрын
베르님 Monobehaviour를 상속받지 않은 스크립트를 가지고 있는 오브젝트를 씬이 바뀌어도 살려두고 싶은데 DontDestroyOnLoad를 사용 못해서 고민입니다 ㅠㅠ 어떻게 해야 좋을까요..
@wergia
@wergia 2 жыл бұрын
우선 모노비헤이비어를 상속하지 않은 스크립트는 게임오브젝트에 컴포넌트로 붙일 수 없습니다. 이것을 가지고 있는 오브젝트의 의미는 게임오브젝트에 부착된 컴포넌트가 해당 클래스의 객체를 가지고 있다는 뜻인가요? 그렇다면 해당 클래스나 필요한 변수를 static으로 선언해서 전역적으로 접근가능하게 하는 방법이있습니다.
@upzerg
@upzerg 2 жыл бұрын
@@wergia 베르님 말씀은 모노비헤이비어를 상속받지 않은 스크립트는 어짜피 "살아있는 게임 오브젝트에 있는 스크립트만 작동한다"
@wergia
@wergia 2 жыл бұрын
@@upzerg 네. 모노비헤이비어를 상속받지 않은 일반 C# 클래스는 객체의 참조만 잃어버리지 않으면 계속해서 사용가능합니다. wergia.tistory.com/186
@upzerg
@upzerg 2 жыл бұрын
@@wergia 감사합니다 선생님!!
@user-hj4st8co9n
@user-hj4st8co9n 2 жыл бұрын
베르님! 싱글톤 패턴을 적용하는 상황이 너무나 궁금합니다.. 저가 인터넷으로 찾아본 경우로는 해당 객체의 단 하나의 객체만 생성을 필요로할 때와 씬이동시 정보초기화방지 이렇게만 간단하게 알고있어서... 사실 위의 글로도 이해는 가지 않습니다. (싱글톤 을 안쓰면 무언가 중복으로 생성되는 것인지..?, 단하나의 객체가 필요한게 뭐가있는지도 잘 모르겠네요...) 초짜배기라 간단한 것도 이해가 잘 되지 안되네요 ㅜㅜ
@wergia
@wergia 2 жыл бұрын
싱글톤은 어떤 클래스를 기반으로 생성되는 오브젝트가 단 하나일 것을 보장하는 패턴입니다. 사용되는 예를 들어보자면 어떤 하드웨어와 연결을 담당하는 클래스가 있을 수 있습니다. 하드웨어와의 연결은 보통 하나의 오브젝트와 하나의 하드웨어, 1:1로 연결되는 것이 보통입니다. 특히 하드웨어가 하나의 연결만을 허용하는 경우라면 더더욱 그렇습니다. 어느 한 오브젝트가 하드웨어와 이미 연결되어 있는 상태에서 다른 오브젝트가 하드웨어와 연결하려고 시도하면 에러가 발생하죠. 그러므로 하드웨어와 연결하는 오브젝트는 단 하나만 있어야 합니다. 싱글톤을 적용하기에 좋은 대상인거죠.
@user-hj4st8co9n
@user-hj4st8co9n 2 жыл бұрын
@@wergia 답글 너무나 감사합니다! 자세한 설명감사드립니다. 그럼 여기서의 하드웨어는 게임 요소에서 인벤토리창, 창고, 스텟, 레벨, 아이템(아이템 중에도 유일한 퀘아이템 등) 같은 요소 라고 생각해도 될까요?
@woor7791
@woor7791 2 жыл бұрын
정말.. 코딩은 뭐랄까요.. 왕도가 없는거 같아요 뭔가 한바퀴를 뺑~~~~돌고 와서 보니깐 이해가 되는군요 기초기초 하는 이유가 있습니다.
@wergia
@wergia 2 жыл бұрын
많이 해볼 수록 잘하게 되죠 ㅎㅎ
@CodeBlues-
@CodeBlues- 3 жыл бұрын
전 그냥 이렇게 사용하는데 틀린건가요? public static GameManager Instance; void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } 이 코드가 가장 심플해보이고 검사도 들어가 있어서 얼추 2년넘게 사용하고 있었는데, 뭔가 제가 잘못하고 있었나봐요...ㅋㅋㅋ 이벤트나 델리게이트 쓰기 귀찮아서 싱글톤쓰곤 있는데, 확실히 나중가면 참조를 알 수 없게 됨 ㅋㅋㅋ
@wergia
@wergia 3 жыл бұрын
간단하게 사용할 때는 나쁘지 않은 방법입니다. 개발속도가 중요하고 구조 설계가 그렇게 중요하지 않은 개발에서는 저도 자주 사용하는 편입니다. 하지만 제대로된 구조 설계가 필요할 때는 댓글 상단 고정해둔 시큐님 댓글처럼 신경써서 개발하는게 좋겠죠?
@donuko5036
@donuko5036 3 ай бұрын
프라이베잇 x, 프라이빗 o
@WisdomCleo
@WisdomCleo 3 жыл бұрын
헐... 왤캐 어렵게 느껴지지 ㅜㅜ
@wergia
@wergia 3 жыл бұрын
처음 써보면 누구나 어렵게 느끼죠 ㅎㅎ 저도 처음 공부할 때는 많이 어렵게 느껴졌어요 그래도 여러 가지 패턴을 필요한 곳에 자주 써보게 되면 점점 쉬워진답니다ㅎㅎ
@WisdomCleo
@WisdomCleo 3 жыл бұрын
처음 포인터 접하는 느낌이었어요 열심히 공부해보겠습니다 !!
@wergia
@wergia 3 жыл бұрын
@@WisdomCleo 힘내세요!
@GO0Es
@GO0Es 10 ай бұрын
뭐라는지 1도모르겟네..
로딩 화면 구현하기(로딩 UI 방식) | 유니티
11:03
베르의 게임 개발 유튜브
Рет қаралды 11 М.
Convert CSV files To ScriptableObjects -  Editor Utility [Unity Tutorial]
15:19
WORLD'S SHORTEST WOMAN
00:58
Stokes Twins
Рет қаралды 55 МЛН
I studied Unreal for a Month (+What i learned)
7:40
윤농 Yunnong
Рет қаралды 194 М.
로딩 화면 구현하기(로딩 씬 방식) | 유니티
10:12
베르의 게임 개발 유튜브
Рет қаралды 26 М.
Learn Reverse Engineering (for hacking games)
7:26
cazz
Рет қаралды 1 МЛН
디자인패턴 첫번째 - 초보자를 위한 싱글톤
17:37
오늘코딩
Рет қаралды 21 М.
언리얼 엔진과 유니티! 누가 황제일까?
7:41
이우
Рет қаралды 161 М.
The Unreasonable Effectiveness Of Plain Text
14:37
No Boilerplate
Рет қаралды 594 М.
프리팹 | 유니티
9:09
베르의 게임 개발 유튜브
Рет қаралды 11 М.
[Unity/MiddleClass] Scriptable Object
9:02
베르의 게임 개발 유튜브
Рет қаралды 18 М.