-
안녕하세요.
원래 상점 NPC를 작업하려고 했는데 ObjectPool을 적용한 코드 작업을 보려고 합니다.
Enemy를 죽이면 50%의 확률로 골드 아이템이 생성됐었는데요.
새로 생성하는 것보다, 오브젝트 풀 방식으로 관리하는 게 훨씬 효율적이니
간단하지만, 효과적인..
처음엔 잘 모르지만 점점 효과가 누적되면 태산이 되는
바로 저 같은..네. 바로 코드로 들어가겠습니다.
우선.. 작업한 부분을 어디서부터 봐야 할지 찾아보다가
gold 아이템 구현 부분을 설명 안 드린 것 같아
Enemy가 죽으면 떨어트릴 Gold Item 작업 부분부터 먼저 보면서 천천히 나가겠습니다.
gold에 입혀질 Item_Gold스크립트의 전체 스크립트입니다.
gold_Text : 얻는 골드를 시각화해줄 text입니다.
(TextMeshProUGUI를 사용하기 위해 using TMPro 네임스페이스를 선언하였습니다.)
gold : 획득할 gold입니다.
(이 얻은 gold를 string으로 변환시켜 text로 표현할 것입니다.)
매 활성화 시 실행되는 OnEnable 함수입니다.
gold는 랜덤 Random.Range를 이용해 1부터 3까지의 값을 부여받게 했습니다.
float값은 최댓값이 포함되고
int값은 최댓값이 제외됩니다.
즉 Random.Range(1, 4)는 1~4
Random.Range(1.0f, 4.0f)는 1.0f ~ 4.0f
간단하지만 깜빡한다면 재 작업을 해야 하는 일이 벌어질 수 있습니다.
(주어진 같은 시간 효과적인 사용 아즈아!)
충돌 체크는 OnTriggerEnter에서 구현되게 했습니다.
충돌 시 OnTriggerEnter
충돌 중 OnTriggerStay
충돌 해제 시 OnTriggerExit
간단히 자기 자신(gold)을 비활성화시켜 주며
획득할 텍스트의 값의 부여와 활성화를 시켜주는 코드입니다.
그렇다면 이 골드가 활성화가 될 때를 보겠습니다.
gold Item이 활성화가 될 때에는
Enemy가 Die 했을 시입니다.
앞으로 알아볼 objectPool에서 gold를 꺼내와
제어하기 위해 GameObject gold를 선언했으며
gold의 position은 transform.position(enemy)
활성화를 시켜주는 모습입니다.
(이렇게 해주면 매 번 바뀌는 enemy의 위치를 찾지 않아도 바로 활성화가 가능합니다.)
그럼 이제 진짜 본론! objectPool의 코드를 보겠습니다.
Manager_Obj 스크립트의 선언 변수들입니다.
크게 Pool / List / Prefabs 3가지로 보겠습니다.
Pool : ObjectPool 방식으로 사용될 오브젝트들의 부모 오브젝트입니다.
(생성되거나 비활성화되어 있는 오브젝트는 이 Pool에 담겨 있습니다.)
List : ObjectPool 방식으로 사용될 생성/활성/비활성화될 오브젝트들입니다.
Prefabs : 비활성화 오브젝트가 없을 시 새로 생성될 프리 팹입니다.
우선 풀 안에 오브젝트가 모자랄 시 (비활성화된 오브젝트가 없을 시) 새로 생성해 주는 AddObj함수를 만들었습니다.
각 인자는 프리 팹 / 풀 / 리스트 3가지를 받으며
Instantiate를 이용해 prefab을 pool 안에 생성해 줍니다.
이 생성된 오브젝트를 제어하기 위해 GameObject obj로 받았습니다.
이렇게 생성된 오브젝트는 list.Add(obj)로 리스트에 추가시켜 주며, return으로 생성된 obj를 반환해 줍니다.
즉 AddObje함수가 불리면 프리 팹 / 풀 / 리스트를 받아 원하는 오브젝트를 생성되는 함수죠!
제 목적은 생성이 아니니 오브젝트를 꺼내 주는 기능 / 활성화시켜주는 코드를 보시겠습니다.
우선 for문으로 list들을 0번부터 list.count까지 차례대로 검사를 해 주었습니다.
검사를 하다가 list [i] 번째 중 활성화가 되어 있지 않은 오브젝트가 있다면?
((! activeSelf) 로검사를 해 주었고)
return list [i] / 그 오브젝트를 반환하며 함수를 나오게 됩니다.
만일 모두 비활성화되어 있지 않다면?
for문을 지나쳐 아래 if문들 중 list의 조건에 맞게 addObj가 실행되는 코드입니다.
이 GetObj코드를 enemy가 죽었을 시 실행되게 했었죠.
반대로 아이템이 비활성화가 되는 구현은
한번 만들고 계속 재활용 중인
DisableObj 스크립트로 10초 후 비활성화되게 해 주었습니다!!
원활한 동작 구현을 위해서 player의 스킬 쿨타임과 enemy의 체력을 조절하였습니다.
활성화되는 동작, 새로 생성되는 동작, 골드를 획득하는 동작을 모두 담았습니다.
골드 아이템 이외에도
대미지 텍스트 / 골드 획득 텍스트 / 데미지 입히는 텍스트
들은 자주 사용되는 오브젝트로, 새로 생성하지 않고 오브젝트 풀로 관리를 해 주었습니다.
오늘은 여기서 마무리를 하겠습니다!
감사합니다.
'유니티 프로젝트 > RPG 듀토리얼' 카테고리의 다른 글
RPG 듀토리얼 16. Store buy and sell (0) 2022.04.26 RPG 듀토리얼 15. Npc Store OpenStore (0) 2022.04.26 RPG 듀토리얼 13. player & NPC 상호작용 (0) 2022.04.25 RPG 듀토리얼 12. Player Skill (Skill 01 - 03) (0) 2022.04.24 RPG 듀토리얼 11. Player Skill (Skill 00 & Calulate) (0) 2022.04.22