개발일지 목록


#1 - 플레이어 기본 조작

#2 - 무기 기틀 세우기

#3 - 무기 종류 추가 및 업그레이드 구현

#4 - 기본 몬스터

#5 - 몬스터 스폰

#6 - 즉사 공격, 가까운 적 탐색, 데미지 표기

#7 - 플레이어 스텟

#8 - 성능 최적화 (움짤 주의)

#9 - Experience Point

#10 - 넉백 / 미티어 스트라이크

#11 - 경험치 및 레벨업 UI

#12 - HP / SP

#13 - 상호작용 / 타일맵

#14 - 활 무기 개선 및 추가 / 플레이어 팔로우

#15 - 패기 / 길찾기 (1)

#16 - 길찾기 (2)

#17 - 길찾기 (끝)

#18 - 맵 (1)

#19 - 맵 (2) / 공중 유닛

#20 - 맵 (3) / 실내 / 마스크

#21 - 장비 업그레이드 (1)

#22 - 장비 업그레이드 (2)

#23 - 테스트 플레이 & 중간 점검 (1)

#24 - 방패 무기



경험치 오브젝트


이미 이전에 구현을 해 두었던 부분이지만

테스트 플레이를 해보며 조금 아쉽게 느껴지는 부분들이 있었음.

따라서 체력 회복이나 골드 등의 아이템을 구현해주기로 하였는데,

아이템도 경험치와 유사한 시스템이기 때문에

구현 전에 경험치 오브젝트를 한번 개선을 해주기로 했음.


개발일지#9 - 경험치에 이전 구현 과정이 작성되어 있으니 궁금하다면 참고할 것.


실 플레이 하며 느꼈던 점은 이 경험치 오브젝트가 생각보다 많이 작아서

몬스터가 많아지면 잘 안보인다는 것.

뱀서를 하며 빨간 젬을 찾아 먹던 것을 생각해보면 좀 더 눈에 띌 필요가 있을 것 같다.



그래픽


에셋에 광물 그래픽이 있으므로 이것을 사용했음.

경험치는 몬스터의 마석이라는 설정이라 괜찮은 것 같음.

7dec9e21ecd418986abce8954485756bf04aea

요런 느낌이고 덩그러니 놓여있으면 어색한 느낌이 있다보니

그림자와 상하로 움직이는 애니메이션을 추가해주었음.

그만큼 존재감이 커져버려 화면이 어지러워지는 문제가 있을 것 같지만

실 플레이 시에는 또 느낌이 다르다보니 일단 보류.


다만, 이 경험치 오브젝트를 몬스터와 같은 소팅을 주게되면

몬스터가 지나치면서 앞뒤로 넘나들게 되고

몬스터를 가려버려서 너무 어지러워지므로 몬스터의 아래에 소트되도록 하였음.


획득 시에는 소트오더를 올려서 몬스터 위로 올라옴.

그대로 아래에 있으면 빨려들어오는데 어색해보였음.

7def9e21ecd418986abce8954384776dd4347d


덤으로 레벨업 시에도 마석이 떨어지는 효과가 동일한 스프라이트이므로 변했음.

7dee9e21ecd418986abce8954085746e73fa

약간... 석기시대 돌멩이 모양 초콜릿이 생각나는 것...

반짝



문제점


몬스터의 아래로 가려지므로 신경써서 보면 어색하게 느껴짐.

7de99e21ecd418986abce89547857065b7c887

마석 위로 뛰어오는지라 묘한 것...


주변에 의견을 물어보니 플레이어 입장에서는 딱히 신경안쓰이는 듯 싶음.

7de89e21ecd418986abce8954482766ede5dfb

자세히 보면 넓게 퍼졌다가 빨려들어갈 때에 자연스럽게 해주기 위해

넓게 퍼지면서 그림자로부터 높이도 높아졌다 낮아지는 것을 확인할 수 있음.

입체적인 느낌을 주기 위함.



구현


고민했던 부분과 관련해서 간략하게 작성하겠음.

기존에 OnBecameVisible/Invisible 함수를 사용했는데,

요 경험치가 그림자 스프라이트와 마석 스프라이트 2개의 자식 스프라이트 오브젝트 두개로 이루어지게 변하면서

위 이벤트 함수의 사용이 불가능해짐.

해당 이벤트함수는 스크립트가 부착된 게임오브젝트의 Renderer 컴포넌트가 카메라에 보이거나 안보이게 될 때 발생하기 때문.


위 문제를 해결하기 위해 생각한 방법은 3가지.

첫번째는 애니메이터 컴포넌트는 Culling Mode라는 옵션이 있는데

기본값인 Always Animate가 아닌 Cull ~ 옵션을 선택하면 카메라에서 보이지 않을 경우 애니메이터 동작을 멈춰줌. (성능을 위해)

따라서 카메라에서 보이지 않는지를 애니메이터 컴포넌트가 자식 오브젝트들의 렌더러까지 보이는지 체크하기 때문에

관련 프로퍼티를 이용하려고 했음.

하지만 아쉽게도 존재하지 않음.


두번째는 자식 오브젝트들의 Rendrer 컴포넌트의 isVisible 프로퍼티를 Update문에서 체크하는 것.

사용하면서 게임오브젝트 활성화/비활성화를 하지 않고 스프라이트 enabled를 바꾸고 있기 때문에 일단 패스.


세번째로는 자식 오브젝트들에 OnBecameVisible/Invisible 이벤트 함수가 있는 스크립트를 붙여서 체크하는 것.

여기저기 스크립트가 많이 붙겠지만 제일 간단하고 기존 방식이 유지되므로 요걸로 선택함.

간단하므로 스크립트도 첨부.



부모 오브젝트에 부착될 스크립트.

1eb3d136abc236a14e81d2b628f1766bb82d6b64

자식 오브젝트의 스크립트에서

Awake 시에 체크해야할 오브젝트 수를 Add~함수로 파악 후,

Visible/Invisible 이벤트 함수 호출 시

UpdateVisibility 함수를 호출하여 visiblecount에 변동을 주고 전부 보일 시 보임 이벤트, 0개일 시 안보임 이벤트 발생


자식 오브젝트들에 부착될 스크립트

1eb3d136a59a69ef20afd8b236ef203ed45e06da55ada0df

자식 오브젝트에선 Awake시 부모의 Cheker 스크립트를 찾아 자신의 개수를 더해주고

이벤트 함수 시 알려줌.



7dee9e36ebd518986abce8954786766f73

실제 사용은 요런 식으로 이벤트에 연결해서 할 일을 해줌.


일단은 잘 동작하는 것 같은데

혹시 몰라서 Checker 스크립트에서 Clamp함수를 사용해서 최소 최대치 제한을 두었음.




원래는 뱀서처럼 화면 내에 경험치 오브젝트 수가 최대치에 도달하면

몬스터를 죽일 시 드랍 대신 기존 오브젝트에 누적시키려 하였으나

처음에 의도했던 제자리에서 가만히 있는 플레이나

경험치를 먹지 않고 누적시키는 플레이라던지

빙빙 한 지점을 도는 플레이를 방지하기 위해 해당 시스템은 제거했음.

대신 이후에 만들어줄 구역마다 랜덤하게 존재하는 보상을 통해 경험치를 보충해줄것 같음.


다음엔 진짜로 아이템으로 돌아오겠음 !

안냥