오브젝트 풀링 구현하기 | 유니티

  Рет қаралды 15,500

WER's GAME DEVELOP YOUTUBE

WER's GAME DEVELOP YOUTUBE

Күн бұрын

유니티 엔진에서 오브젝트 풀링을 구현하는 방법을 알아봅시다.
타임라인
0:00 인트로
0:13 - 오브젝트 풀링이 필요한 이유
2:06 - 오브젝트 풀링의 개념
3:37 - 오브젝트 풀링을 사용하지 않을 때의 성능 저하 확인하기
3:43 - Bullet 기능 만들기
4:53 - 총알을 발사시키는 Shooter 만들기
6:21 - 풀링을 사용하지 않는 총알 발사 기능 테스트하기
6:32 - 프로파일러로 성능 확인하기
6:58 - Instantiate와 Destory가 소모하는 성능
8:04 - 가비지 컬렉터가 소모하는 성능
9:04 - Object Pool 구현하기
9:14 - 간이 싱글톤 패턴 적용과 필요한 변수 선언
10:08 - 새 오브젝트 생성하는 CreateNewObject 함수 작성
10:56 - 초기에 빌려줄 오브젝트를 미리 생성하는 Initialize 함수 작성
11:18 - 오브젝트를 빌려주는 GetObject 함수 작성
11:54 - 빌려준 오브젝트를 돌려받는 ReturnObejct 함수 작성
12:19 - Bullet을 생성하고 파괴하는 코드를 오브젝트 풀링 코드로 대체하기
13:00 - 오브젝트 풀링 테스트
본 영상의 오프닝은 비디오몬스터를 이용해서 만들어졌습니다.
videomonster.com/
[유니티 어필리에이트 프로그램]
아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.
- 유니티 에셋스토어 : prf.hn/l/vJl41D5
- 유니티 플러스 : prf.hn/l/wLNyJZG
- 유니티 프로 : prf.hn/l/qXOybmp
[투네이션]
toon.at/donate/63773521276146...
[Patreon]
/ wergamedevchan
#유니티강좌 #오브젝트풀링 #게임만들기

Пікірлер: 49
@susi2622
@susi2622 3 жыл бұрын
베르님 다른 영상들 보면서 같은 기능을 쉽고 체계적으로 만드는 코딩을 보면서 부족한 이해력으로 그나마 조금씩 이해하면서 적용하고 있습니다. 감사합니다
@isakgo7492
@isakgo7492 2 жыл бұрын
정말 감사합니다 선생님 덕분에 오브젝트 풀링에 대한 개념을 알게되었습니다!
@greatyisoon-sin3402
@greatyisoon-sin3402 4 жыл бұрын
개념 확실히 잡아주시네요 큰 도움이 되었습니다. 지식이 일천해서 수시로 보면서 깨달음이 오면 질문을 더 투척할듯 합니다. 좋은 영상 감사합니다.
@wergia
@wergia 4 жыл бұрын
궁금하신 내용이 있다면 댓글로 알려주세요! 영상은 만들고 싶은 순서대로 만들고 있지만, 리퀘스트가 있고 다룰 수 있는 내용이면 리퀘스트부터 영상으로 만들까합니다.
@user-nk6sc1zr6d
@user-nk6sc1zr6d 2 жыл бұрын
고맙습니다 딱히 아무말안하고 보는편인데 목소리톤이나 편집이나 설명부분이 스킵없어도 충분할정도로 깔끔하고 여타 화면배치가 외궈 프로그래밍팁 영상이랑 비슷해서 좋습니다 특히나 내가 영어로 들으면 중간중간 못들을정도로 회화능력이 높지않은 편이라 이런 한국어 영상은 좋다고 말할수 밖에없네요
@vitatv9720
@vitatv9720 2 жыл бұрын
유니티의 기본 자습서가 되면 좋겠네요..잘보고 갑니다~!
@user-yg4nd3uf7r
@user-yg4nd3uf7r 3 жыл бұрын
이런 실재 개발에서 사용할 수 있는 유용한 알고리즘이 더 많이 올라왔으면 하는 바램입니다.
@wergia
@wergia 3 жыл бұрын
어떤 알고리즘이 좋을지 연구를 해봐야겠네요 ㅎㅎ
@irishong3579
@irishong3579 4 жыл бұрын
강의를 매우 효과적으로 진행하시네요. 다수의 오브젝트 풀링도 강의에 추가해 주시면 좋을 것 같습니다. 지금까지 본 유니티 강의 (국내외) 중 최고 입니다.
@wergia
@wergia 4 жыл бұрын
나중에 고급편으로 한 번 다뤄보겠습니다!
@user-xr3sk1ev7f
@user-xr3sk1ev7f 3 жыл бұрын
선생님 감사합니다...
@unit1285
@unit1285 4 жыл бұрын
좋은 강의네요! 요청이 더 있다면 심화과정의 오브젝트풀링도 영상으로 만들어주시면 좋을것같습니다!!
@wergia
@wergia 4 жыл бұрын
조만간 그 부분도 영상화해보도록 하겠습니다
@user-pq4fe8wd1d
@user-pq4fe8wd1d 2 жыл бұрын
일반 배열이나 리스트로 오브젝트 풀링은 해봤지만 큐로 해보는 건 처음이네요. 잘 배웠습니다! 일반 배열은 길이가 한번 정해지면 바뀌지 않으니 리스트로 하는게 더 낫다고 생각했는데요. 큐나 리스트나 뭘 쓰든 딱히 상관 없으려나요?
@wergia
@wergia 2 жыл бұрын
큐는 선입선출로 관리되어 꺼낼때는 항상 앞에서 꺼내고 다시 반환할 때는 뒤로 넣기 때문에 오브젝트를 꺼내가는 순서가 꼬이지 않을 확률이 높습니다.
@user-te5zz8tc6s
@user-te5zz8tc6s 3 жыл бұрын
좋은 강의 감사합니다. 한 가지 여쭤볼게 있는데, GetObject메소드에서 SetParent를 null로 하는 이유는 뭔가요??
@wergia
@wergia 3 жыл бұрын
부모 오브젝트 없이 월드에 놓기 위해서 입니다.
@user-ui5jr5mi5r
@user-ui5jr5mi5r 4 жыл бұрын
위데브님 코딩보고 디펜스게임에 몬스터 풀링으로 쓰고 있는데요.. 콜라이더에 들어온 몬스터를 리스트에담고 제일 먼저 나온 몬스터를 처리하고 다음 몬스터를 공격합니다 그런데 3번째 나온 몬스터가 죽은상태로 나오고 2번째를 공격 안하고 바로 3번째를 공격합니다 .. 추가로 비활성화된 몬스터를 초기화 시켜야 하는지요..?
@wergia
@wergia 4 жыл бұрын
오브젝트 풀링은 한 번 사용했던 게임 오브젝트를 다시 재사용하는 기법이기 때문에 몬스터와 같이 체력이나 살아있는 상태등의 정보를 가지고 있는 게임 오브젝트를 사용하기 위해서는 빌리는 과정에서 반드시 초기화시키는 코드를 넣어주는게 좋습니다. 그래야 한 번 사용해서 죽은 몬스터가 다시 빌렸을 때 죽어서 나오는 문제가 발생하지 않을 겁니다. 영상에서는 발사된 이후에 부딪힌 대상에 데미지만 주면 끝인 총알을 예시로 사용했기 때문에 초기화 과정이 없는 것처럼 보였을 겁니다. 하지만 총알이 날아가는 방향을 지정하고 발사해주는 Shoot 함수에서 총알이 날아갈 방향을 지정해준 것 역시 일종의 초기화 과정으로 볼 수 있습니다.
@user-cr7wy6jh2p
@user-cr7wy6jh2p Жыл бұрын
베르님 좋은 정보 감사합니다. 몇 가지 궁금한 점이 있는데요. 코드에서 CreateNewObject함수에서 newObj변수에 왜 Instantiate()가 아니라 Instantiate().GetComponent()를 하신 이유가 뭔가요? (왜 스크립트를 할당하나요?) 그리고 poolingObjectQueue.Count가 아니라 Instance.poolingObjectQueue.Count하신 이유랑 Queue에 값으로 할당하면 자동으로 자식 오브젝트가 되는건지(실행을 하니깐 자식 오브젝트로 바뀌어 있어서). 마지막으로 함수 선언을 할 때 앞에 Bullet쓴 이유가 궁금합니다.
@wergia
@wergia Жыл бұрын
1. 가져온 직후에 총알 오브젝트에 날아갈 방향과 속도를 설정해주기 위해서 입니다. 2. Instance를 사용한 이유는 함수가 static 함수라서 일반 멤버 변수를 가져오지 못하기 때문입니다. 3. 자식오브젝트로 따로 만들어줘야 합니다. 4. 함수가 Bullet 타입의 오브젝트를 결과물로 반환한다는 뜻입니다.
@user-ig6tr2en3s
@user-ig6tr2en3s 2 жыл бұрын
감사히 잘 배우고 갑니다. 그리고 몇가지 지문이 있어서 이렇게 올립니다. 1. 총알 프리팹을 풀링할때 만약에 총알이 여러 종류가 있고 플레이어가 총알을 번갈아 교체하면서 사용할 경우 어떻게 풀링하면 되나요? 2. 제가 총알뿐만 아니라 적들과 아이템들도 풀링을 하고 싶어요 그래서 적 들과 아이템들도 마찬가지로 여러가지 종류가 있고 각 종류별로 오브젝트풀링을 하려면 어떻게 하면 되나요?
@wergia
@wergia 2 жыл бұрын
1. Key 값을 따로 주고 가져오면 됩니다! 2. 역시 마찬가지로 Key 값에 따라서 원하는 오브젝트를 가져오면 됩니다. 관련된 내용은 나중에 고급 오브젝트 풀링 영상에서 설명할 예정입니다.
@user-ig6tr2en3s
@user-ig6tr2en3s 2 жыл бұрын
@@wergia 감사합니다.
@user-ms7ug1rn6v
@user-ms7ug1rn6v 2 жыл бұрын
씬마다 Public GameObject monster; 에 담긴 몬스터가 다르고,씬마다 다른4종류의 몬스터를 오브젝트 풀링으로 스폰 하고 싶습니다. 다수의 오브젝트를 오브젝트 풀로 관리하려면 어떤 방식이 가장 좋을까요..ㅠㅠ
@wergia
@wergia 2 жыл бұрын
C# 제네릭을 이용해야 합니다.
@user-ms7ug1rn6v
@user-ms7ug1rn6v 2 жыл бұрын
@@wergia 답변 감사합니다!
@mrbinggrae5954
@mrbinggrae5954 2 жыл бұрын
베르님 나중에 기회가 되면 객체지향 설계에 대해서 함 다뤄주시면 안되나욤?ㅠ
@wergia
@wergia 2 жыл бұрын
나중에 다뤄보도록 하겠습니다.
@mrbinggrae5954
@mrbinggrae5954 2 жыл бұрын
@@wergia 갓베르님 최고!!
@user-kn3nq9sl5n
@user-kn3nq9sl5n 4 жыл бұрын
오브젝트 풀링이 오브젝트 생성하고 그 오브젝트들 다 쓰면 비활성화 하는건가요?
@wergia
@wergia 4 жыл бұрын
네, 비활성화 해뒀다가 다시 필요해지면 꺼내서 활성화 및 초기화 해서 사용하는 기술입니다.
@user-bw3ru6vd8p
@user-bw3ru6vd8p 2 жыл бұрын
12:55 여기서 인보크대신에 코루틴을 써도 문제 없나요?
@wergia
@wergia 2 жыл бұрын
네 코루틴 사용하셔도 됩니다
@upzerg
@upzerg 2 жыл бұрын
선생님, 위 영상에서 처음에 풀링 큐에 총알을 10개만 생성해 두셨는데 게임을 하다가 총알 50개를 발사하고 나면 좀있다가 풀링 큐에는 50개의 총알들이 저장되어 있는 건가요?
@wergia
@wergia 2 жыл бұрын
네 맞습니다
@upzerg
@upzerg 2 жыл бұрын
@@wergia 감사합니다 ㅎㅎ 그런데 만약에 풀링 큐에 너무 많은 오브젝트들이 저장되어버리면 메모리가 부족해질것 같은데 이럴땐 풀링 큐에 있는걸 좀 지워주는 방식으로 설계해도 문제는 없겠죠??!
@wergia
@wergia 2 жыл бұрын
@@upzerg 네 문제없습니다. 다만 풀 안에 들어있는 오브젝트를 초기화하는 시점을 잘 잡아야 합니다. 풀링을 하는 목적이 오브젝트가 생성되고 파괴될 때 발생하는 성능 저하를 막기 위한 것인데, 풀링된 오브젝트를 자주 지우면 풀링을 하는 이유가 없어지기 때문입니다. 풀링된 오브젝트를 지우는 시점은 주로 씬이나 스테이지를 전환하는 경우가 많습니다.
@upzerg
@upzerg 2 жыл бұрын
@@wergia 늦은 시간에도 답변해주시다니 ㅠㅠ 감사합니다
@user-ui5jr5mi5r
@user-ui5jr5mi5r 3 жыл бұрын
오브젝트 풀링에서 꺼내올때 여러개의 스크립트에서 동시적으로 호출해서 불러오면 어떻게되죠? 타워에서 총알발사할때 몇개의 오브젝트에서 발사를 안하네요ㅜ
@wergia
@wergia 3 жыл бұрын
큐 같은 걸 사용해서 요청을 쌓아두고 순서대로 처리하면서 오브젝트를 빌려주는 방식을 사용하면 꼬이지 않게 풀링을 관리할 수 있습니다.
@user-ui5jr5mi5r
@user-ui5jr5mi5r 3 жыл бұрын
@@wergia 큐로 만든 오브젝트 풀링을 A, B, C등의 여러 스크립트에서 동시에 빌려갈때 새로운 큐를 생성해서 그 큐에 빌려갈 스크립트들을 저장시키고 빌려주라는 얘기인거죠?ㅎ
@wergia
@wergia 3 жыл бұрын
@@user-ui5jr5mi5r 음, 오브젝트 풀에서 A, B, C 등 다른 오브젝트가 순서대로 줄을 서서 기다리는 형태로 보시면 될 것 같습니다.
@user-ui5jr5mi5r
@user-ui5jr5mi5r 3 жыл бұрын
감사합니다!ㅎ
@user-bq9qi6ek7t
@user-bq9qi6ek7t 3 жыл бұрын
12:28
@KaneKoHumongous
@KaneKoHumongous 2 жыл бұрын
사랑해요 뽀뽀 쪽
콜라이더 레이어로 충돌을 선택해서 감지하기 | 유니티
6:48
베르의 게임 개발 유튜브
Рет қаралды 5 М.
[Unity/MiddleClass] Make a function to move the character to the clicked position
13:09
베르의 게임 개발 유튜브
Рет қаралды 14 М.
Secret Experiment Toothpaste Pt.4 😱 #shorts
00:35
Mr DegrEE
Рет қаралды 30 МЛН
Эффект Карбонаро и нестандартная коробка
01:00
История одного вокалиста
Рет қаралды 10 МЛН
Summer shower by Secret Vlog
00:17
Secret Vlog
Рет қаралды 12 МЛН
Playing hide and seek with my dog 🐶
00:25
Zach King
Рет қаралды 34 МЛН
Summon by object pooling🏊 [Unity Vampire Survivors Like 06]
41:35
Creating a GitHub repository and uploading a project | GitHub
6:23
베르의 게임 개발 유튜브
Рет қаралды 8 М.
Unity Object Pooling | Unity [UN-OP-1]
6:40
베르의 게임 개발 유튜브
Рет қаралды 11 М.
유니티 JSON 저장과 불러오기 ! (Save and load tutorial using Unity JSON)
25:30
NK Studio의 유니티 스페셜 테크닉
Рет қаралды 12 М.
디자인패턴 첫번째 - 초보자를 위한 싱글톤
17:37
오늘코딩
Рет қаралды 21 М.
[Unity/MiddleClass] Scriptable Object
9:02
베르의 게임 개발 유튜브
Рет қаралды 18 М.
유니티 + 깃허브로 프로젝트 관리하기 | 유니티
20:50
베르의 게임 개발 유튜브
Рет қаралды 57 М.
양궁 남자단체 한프전! 대한프랑스인 최대 위기..
17:36
파비앙 Fabien Yoon
Рет қаралды 664 М.
로딩 화면 구현하기(로딩 씬 방식) | 유니티
10:12
베르의 게임 개발 유튜브
Рет қаралды 26 М.
Secret Experiment Toothpaste Pt.4 😱 #shorts
00:35
Mr DegrEE
Рет қаралды 30 МЛН