ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RPG 듀토리얼 14. Object Pool & item Gold
    유니티 프로젝트/RPG 듀토리얼

    안녕하세요.

    원래 상점 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

     

    Collider

    간단히 자기 자신(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초 후 비활성화되게 해 주었습니다!!

     

    Mnager_Obj 스크립트 입니다.

    원활한 동작 구현을 위해서 player의 스킬 쿨타임과 enemy의 체력을 조절하였습니다.

    00 : 43초

    활성화되는 동작, 새로 생성되는 동작, 골드를 획득하는 동작을 모두 담았습니다.

     

    골드 아이템 이외에도 

    대미지 텍스트 / 골드 획득 텍스트 / 데미지 입히는 텍스트 

    들은 자주 사용되는 오브젝트로, 새로 생성하지 않고 오브젝트 풀로 관리를 해 주었습니다.

     

    오늘은 여기서 마무리를 하겠습니다!

     

    감사합니다.

     

    댓글

김효겸 / Tel. 010-7735-0580 / E-mail. dollzzang2@hanmail.net