- 관련게시물 : 댕댕이 서바이벌 #3 - 무기 종류 추가 및 업그레이드 구현

- 관련게시물 : 댕댕이 서바이벌 #2 - 무기 기틀 세우기

- 관련게시물 : 댕댕이 서바이벌 #1 - 플레이어 기본 조작

드디어 몬스터를 만들 시간이 되었다.

에셋을 사용하므로 몬스터 종류는 많이 만들 수 있을 것이라 생각되지만

일단 흔한 슬라임으로 시작해보았다.


7ded9e31e0d0288650bbd58b36837065a856

슬라임의 이동 모션.

요런 식으로 꿈틀거리며 이동하는 타임은 일정 속도로 매 순간 이동하는 것이 아닌

위 사진의 경우에는 점프할 시에만 이동한다.

따라서 애니메이션과 실제 이동의 타이밍을 맞추어 주어야 한다.

스크립트에서 제어하는 방법도 있으나

애니메이터를 사용하는 이상 깔끔하게 애니메이터에서 애니메이션 관련 작업들을 다 해주는 것이 좋다고 판단되었다.


7def9e36ebd518986abce89547847364f7

따라서 점프 타이밍에 맞추어 적에게 공통적으로 상속되는 베이스 스크립트에 애니메이션용 이동배수를 설정해주고 세팅했다.


고민했던 부분도 있는데 슬라임이 쉴세 없이 점프해 오는건 뭔가 힘들어보지 않나 싶어서

점프 사이에 idle 모션을 랜덤하게 대기시켜보려 했으나

두가지 타입을 테스트해보니 그냥 계속 점프해도 별 어색함이 없어서 이대로 진행하기로 했다.


7dec9e31e0d0288650bbd58b368075651475a9aa

매 프레임 각 몬스터가 플레이어로의 방향을 체크해 그 방향으로 이동해주도록 했다.

덤으로 애니메이션도 설정해주었는데,


7dec9e36ebd518986abce8954480746d04

몬스터 그래픽을 대략 체크해본 결과 좌우반전으로 되어있었다.

오른손에 칼을 들고 있었다면 반대방향은 왼손에 칼든 모습으로 변해버리는

그런 거슬리는 부분이 있지만

좌우반전이어도 명암은 좌우반전이 아니므로 좌우 애니메이션은 따로 설정해주었다.

대다수의 네임드 / 보스 몬스터가 아닌 몬스터는 요 애니메이터의 형식을 따를 예정이므로

일반 몬스터는 애니메이터 오버라이드 컨트롤러와 몬스터 스텟 정도만 바꿔주면

여러 종류의 몬스터로 양산이 가능해질 듯 하다.



7def9e31e0d0288650bbd58b368374650ad1c6

넉백을 구현해주었다.

플레이어 투사체에서 OnTriggerEnter 시 충돌체들의 HealthBase 스크립트를 getcomponent하여

Damage를 주는 함수를 호출한다.

인터페이스로 데미지만 구현해주어도 되겠지만

어짜피 데미지 받는 부분은 특별할 일 없는 이상 다 똑같은 구현부일테니

그냥 모노비헤이비어 하나 더 붙여주는 방식으로 했다.


넉백 시에는 무기 스텟의 넉백파워를 이용하여 일정시간동안 플레이어를 향한 반대 방향으로 속도를 제어해주었다.

속도는 OutSine그래프의 형대로 줄어들도록 하여 조금은 자연스러워보이나

Dotween을 사용중이라 몬스터가 수백마리가 되면 성능이 어떨지는 모르겠다.


추가적으로 데미지를 받을 시 몬스터 스프라이트가 깜빡거리게 하고싶었는데

하얀색 머티리얼을 바꿔끼우는 방식이나 현재 머티리얼에서 반짝이게 하기 위한 값을 변동시켜주는 방식 모두

batch 값이 와자작 나버린다.

10정도였던 batch가 80까지 올라가버린다.

왜그런가 하였더니

두 방식 모두 다른 유닛의 머티리얼과 다른 머티리얼이 되어

드로우 콜과 배치 모두 굉장히 높아져버린다.

스프라이트 렌더러의 컬러값을 이용해 셰이더를 작성하면 될 듯 싶은데

셰이더는 정말 하나도 모르는지라 일단은 그냥 기본 머티리얼을 이용해 어둡게 깜빡이기로 세팅.

몇 번 셰이더를 만져보다가 urp 2d light도 사용하게 되지 않을까 싶어 나중에 체크해주도록 하겠다.


이렇게 구현과 최적화를 같이 하려고하니 진행 속도가 느려서

앞으로는 구현을 최우선으로 생각중이다.



7def8168f2d73ab64e81d2b628f1756ba954f1f8

몬스터의 체력이 다할 시에는 바로 죽는 애니메이션이 실행된다.

이 때 rigidbody의 simulated만 false로 바꿔주면 알아서 콜라이더도 체크되지 않는다.


7dee9e31e0d0288650bbd58b3683766fb34e3903

일단은 괜찮아보이는데 공격범위가 굉장히 작은듯하다...


7deb9e31e0d0288650bbd58b3680776c3015f4a0

플레이어의 Mass값을 다른 몬스터보다 높게 주어 적은 양은 쉽게 밀고갈 수 있다.

하지만 물량이 많다면 밀고가기는 힘들 듯 하다.


7dee9e36ebd518986abce89545897568

마지막으로 몬스터 간의 그림자가 겹치면 alpha값이 더해지는 부분도 굉장히 거슬린다.

찾아본 해결방법은 stencil버퍼를 이용해서 한번만 렌더링되게? 하는 듯 싶은데

이것도 결국 셰이더를 이용해야되서 나중으로 보류...


이것으로 일반 몬스터의 대략적인 구현은 끝.

다음은 몬스터 스포너를 구현해주고

플레이어 스텟과 경험치 드롭을 구현해주어야겠다.


화면 밖으로 나간 몬스터 처리, 몬스터 스폰 메커니즘 등 고민할 것이 많을것 같다.

안냥