ABOUT ME

천리 길도 한 걸음부터

Today
Yesterday
Total
  • Land Of Memories - Hp(Hit) - ObjectPool
    유니티 프로젝트/RPG-2D

     

    이번 작업은 몬스터의 HP Bar 관련 구현과 Hit() 함수

    플레이어의 HP Bar 관련 구현과 Hit() 함수를 다뤘습니다.

     

    바로 본론으로 들어가, Monster의 하이어라키 계층구조부터 살펴보겠습니다.

    Canvas를 World Space로 하여 3D 공간에 렌더링 되게 하였습니다.

     

    Canvas Render Mode

     

    Screen Space - Overlay

    일반적인 UI 모드로 카메라에 영향을 받지 않고 항상 화면 위에 고정인 형태

    화면 크기에 따라 UI 요소의 크기가 조정

    (메인 메뉴 UI 같은)

     

    Screen Space - Camera

    특정 카메라 기준으로 렌더링 됨

    Ui가 카메라 위치와 회전에 따라 움직일 수 있음

    (2D 미니맵 같은)

     

    World Space

    Canvas가 게임 오브젝트처럼 취급되며 이 Ui 요소는 3D 오브젝트와 상호작용 할 수 있음

    (3D 환경에서 사용, 공간에서 위치 및 크기 조정 가능)

     


     

    먼저 monster 스크립트부터 살펴보겠습니다.

     

     

    monsterSproteRenderer : 몬스터 피격 효과를 주기 위해 받아온 컴포넌트입니다.

    hpBarBackGround : 몬스터가 죽으면 비활성화하기 위해 받아온 오브젝트입니다.

    hpBar : fillAmount을 게이지처럼 사용하기 위함입니다.

    monsterHp : 현재 최대 체력입니다.

    (스텟의 체력을 높이게 되면 이 최대 체력을 올려주고 데이터를 저장할 예정입니다)

    monsterCurrent : 몬스터의 현재 체력입니다.

    pool : 오브젝트 풀링을 사용하기 위해 선언한 List 변수입니다.

    boomEffectPrefab : 몬스터가 죽게 되면 실행시킬 함수가 담겨 있는 스크립트입니다.

     

    다음은 Hit가 될 때 함수를 보겠습니다.

    damage가 입력되면

     

    현재 체력에 damage를 빼 줍니다.

    (ex 100 - 10 = 90)

     

    다음은 체력 비율을 계산해 주었습니다.

    (ex 90 / 100 = 0.9)

     

    그다음 fillAmount를 비율 계산을 한 값으로 설정해 주었습니다.

     

    StartCoroutine()으로 실행될 MonsterSpriteEffet()는

     

    몬스터의 피격 효과를 나타내 주기 위함입니다.

     


     

     

    다음 StartCorutine() 다음을 보자면

     

    현재 체력이 0보다 작거나 같으면 몬스터가 죽는 로직이 실행되게 변경하였습니다.

    (기존 monsterCurrentHp 변수는 선언되어있지 않고 monsterHp 만 있었음)

     

    우선 GameObject effect =  GetObj()를 살펴보기 전에!

     

    effect.transform.position = transform.position

    (effect의 위치를 죽은 몬스터의 위치로 가져옵니다.)


    effect.SetActive(true);

    (effect를 활성화해줍니다.)


    hpBarBackGround.gameObject.SetActive(false);

    (몬스터는 죽었으니 게이지바는 비활성화해줍니다.)


     

     

    다음은 ObjectPool을 구현해 보았습니다.

     

    AddObject() 함수가 호출이 되면 

     

    Instantiate를 이용해 Object를 생성해 냅니다.

     

    그 이후 List에 담아 준 뒤 return으로 반환해 줍니다.

     

     

    GetObj()

    for 반복문을 통하여 활성화되어있지 않은 오브젝트를 검사합니다.

    활성화 되어 있지 않은 인덱스에 검출이 되면 즉시 return으로 함수를 종료하며 pool [i]를 반환합니다.

     

    만일 for문 안에 return이 실행되지 않는다면 현재 비활성화되어 있는 오브젝트가 없는 것으로 판단하고

     

    AddObject() 함수를 호출에 새로 생성해 주는 구현입니다.

     

     

     

    현재 effect 오브젝트는 총 10개를 담아 두었습니다.

     

    사실상 현재 구현으로는 10개는커녕 2개도 연속으로 활성화하기가 힘든 상태이지만

     

    스킬이나 공격력이 증가하면 넘어 버릴 수도 있으니 어림잡아 10개를 생성해 두었습니다.

     

    *effect 관련 스크립트는 마지막에 하겠습니다.


     

    다음은 Player 스크립트입니다.

     

     

    위에서 부처 차례대로 보겠습니다.

    hpBar : 플레이어의 화면 하단에 있는 HpBar

    hpBarText : 화면 하단에 있는 HpBar Text

    playerHp : 최대 체력

    playerCurrenHp : 현재 체력

    playerAtk : 플레이어 공격력

    playerDef : 플레이어 방어력

    입니다.

     

    기존 몬스터를 감지하고 Hit()를 호출하는 로직에서

     

    인자로 playerAtk(공격력)만 넣어 주었습니다.

     

     

    이후 플레이어도 Hit가 되면 게이지바의 텍스트를 업데이트해주며

     

    비율을 계산하여 fillAmount에 반영해 주었습니다.

     


     

    마지막으로 BoomEffet입니다.


    먼저 이 오브젝트(BoomEffect)가 활성화되면

     

    OnEnable() 함수를 통해 StartCorutine으로 코루틴 EffetFire()가 실행됩니다.

     

    alphaValues : 각 Color의 alpha 값을 조절할 배열입니다.

     

    먼저 SetSpritesAlpha() 함수부터 보겠습니다.

     

    인자로는 alphaValues의 각 인덱스로 접근하였습니다.

    (0.1f, 0.2f, 0.3f...)

     

    spritest [] : 현재 불 이미지가 총 5개입니다.

     

    이 5개의 이미지를 alphaValues의 배열 인덱스 0부터 실행됩니다.

     

    { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.4f, 0.3f, 0.2f, 0.1f, 0f }

     

    이 끝나면 이 아래 로직인 

     

    EnableColliders(true) 함수가 실행되며

     

    SetSpritesAlpha(1f)로 alpha가 1로 변경이 됩니다.

     

     

    EnableColliders() 함수는 각 콜라이더를 파라미터 enabled에 맞게 true / fasle 해주는 함수 구현입니다.

    (현재는 true)

     

    마지막으로 enabled를 False로 초기화해주고

     

    오브젝트도 비활성화해주었습니다.

     


     

    이 콜라이더가 켜져 있을 때 플레이어가 감지된다면

     

    Hit()를 호출하여 50의 Damage를 입게 해 줍니다.

     


     

     

    생각을 해보니

     

    maxHp , Str, Def,  Exp, Level 들 + 레벨업시 획득하는 스탯 포인트 들은 데이터를 저장하고

     

    변경이 될 때 같이 업데이트를 해줘야 할 것 같습니다.

     

    레벨업을 하고 스탯 포인트를 얻었는데, 갑자기 프로그램이 꺼지고 재 실행 했을 때

     

    모두 초기화가 되어 있다면 너무 허무할 것 같습니다.. OTL

     

     

    다음 작업은

    maxHp , Str, Def,  Exp, Level, StatPoint에 대해 집중 적으로 작업을 하고

     

    씬 이동(StageLevel01) 되는 구현을 이어서 나가보겠습니다.

     

     

    감사합니다.

     

     

     

    '유니티 프로젝트 > RPG-2D' 카테고리의 다른 글

    댓글

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