사실 이 회고를 오늘 할게 아니라 1차 데드라인 기한이었던 저번주 금요일에 했어야했는데...
밤새 작업하고 정신이 하나도 없기도 했고 그날은 뭔가 해방감을 맛보고 싶어서 회고하지 않았다.
사실 다 게을러서 그런거다..
구현사항
본래 최종프로젝트에서 내가 맡은 부분은 전반적인 UI와 매니저를 통한 데이터관리였다.
그러나 우리조의 업무분담 실패로 팀원 한분이 너무나 많은 작업량을 떠안게 되었고, 이대로 간다면 내가 포트폴리오에 쓸것이 얼마 없을것이라는 튜터님의 말씀에 의해 본래 그분이 작업하셔야했던 타워공격로직 제작을 내가 맡게 되었다.
이번 프로젝트에서 우리가 구현할 타워는
- 영웅
- 용병
- 바리케이드
- 함정
이렇게 총 4종류이고, 이중 적의 이동을 막을 바리케이드에는 체력을 구현해야했고, 길목에 깔려 적이 밟을때마다 발동해야하는 함정과 언덕위에서 원거리 공격을 해야하는 용병 등 각 타워의 종류별 특징이 달랐기에 각자의 로직을 별도로 짜야했다.
또한 타워를 일반 타워로 한게 아니라 에셋스토어에서 애니메이션이 입혀진 2D 스프라이트로 하기로 했기에 공격중인지 공격중이 아닌지 상태를 적용하여 애니메이션 움직임도 설정해줘야했기에 StateMachine을 사용해야 했다.
이미 여기서부터 구상하는데 머리가 터질뻔 했지만 최종이전에 팀프로젝트로 타워디펜스 만들어본적도 있고, 팀원분이 적의 움직임을 구현하기 위해 StateMachine을 구현해둔게 있으니 그것을 적당히 잘 활용하면 될 터였다.
그래도 알고 쓰는 것과 모르고 쓰는 것에는 엄청난 차이가 있으니 역할분담이 다시 이루어진 당일에는 상태머신에 대해서 공부하느라 하루를 꼬박쓴거 같다.
타워가 콤보어택 등 다양한 움직임을 가지거나 플레이어가 직접 컨트롤 하는 요소가 없기 때문에 enum을 활용한 상태머신으로 간단하게 만들고 타워의 주요기능은 Idle과 Attack을 구현한 뒤, 상태머신을 가지는 타워들은 적의 위치를 찾고 범위내에 들어오는 적을 공격하게끔 코드를 짰다.
적의 위치가 어디냐에 따라서 타워가 회전하게끔 만들었는데 3D 게임에서 2D 스프라이트를 쓰려니 카메라에 맞춰서 타워의 로테이션 x,y 값을 세밀하게 조정을 해줘야했다.
여기에 바리케이드는 체력을 달아주고 적에게 공격당할시 데미지를 받게끔 enemy와 연결을 해주면 되었다.
위의 상태머신을 모든 타워가 공통으로 쓰면 좋겠지만.. 용병과 영웅은 원거리 공격을 하므로 투사체를 발사하게 따로 구현을 해주어야 한다. 그래서 TowerController 스크립트를 상속받는 Mercenary 스크립트를 따로 만들어서 투사체를 발사하게 해주었다.
그뒤는 투사체가 적에게 닿아서 데미지를 넣어야 하기 때문에 투사체가 적에게 이동을 해야했다. 단순히 투사체가 일직선으로 날아가게 한다면 구현하기 참 쉬웠겠으나.. 적들이 가만히 있는게 아니기에 적을 향해 날아가게 해야했다.
그렇게 하기 위해서는 TowerController에서 설정한 target을 총알에게 넘겨주고, 타겟을 향해 날아가게 코드를 짜주면 된다. Lerp, Translate 둘중에 써본적없는 Translate를 써보았다. 또한 총알이 용병의 공격사거리를 넘어간다면 파괴되게끔 해주었다.
이렇게 용병의 공격을 구현하고, 함정의 공격을 구현할 차례가 되었다.
함정은 적과 함정이 접촉하면 발동되고, 함정에서 벗어나면 발동이 풀리게 할 생각이었다. 즉 상태머신 컨트롤러를 통한 상태의 관리가 필요없다는 것이다.
적이 함정을 밟았을때 발동하게 하기위해 OnTriggerEnter를, 적이 함정에서 떨어졌을때 발동을 해제하기 위해 OnTriggerExit를 사용했다. 모든 Collider에 발동하게끔 하면 함정을 깔 맵이 가진 Collider에도 반응하기때문에 TryGetComponent로 Enemy에게만 발동되게 하고, 리스트의 0번 인덱스에 적을 넣고 빼고 하는 작업을 하게 해주었다.
함정이 발동되는 메서드는 코루틴으로 만들어 쿨타임마다 리스트의 0번 인덱스의 적에게 공격을 가하게끔 한다. 함정에 의해, 혹은 다른 타워들에 의해 죽게 될 경우 코루틴을 빠져나오게 한다. 상태머신을 활용할 필요 없이 코루틴을 실행했다 멈췄다만 하게 하면 되다보니 break를 사용하면 되었다.
개선해야할 부분
- 타워들의 애니메이션 관련하여 수정이 필요하다. 현재는 공격속도에 맞춰 애니메이션이 움직이는게 아니라 공격상태일때 공격모션을 계속 반복하는데 쿨타임 중일때는 animation의 bool을 false로 바꾸는 수정을 하면 되지 않을까 싶다.
- 게임 클리어시 타워가 공격대상을 찾지 못해 MissingReferenceException이 나오는데 이에 대한 예외처리 적용이 필요하다.
- 바리케이드의 공격력이 0일경우에 공격상태로 넘어가지 않게해서 공격을 하지 않게끔 해야한다.
- 투사체가 제 멋대로 날아가는 버그가 가끔가다 한번씩 존재하는데 이에 대한 해결책으로 투사체 이동방식을 바꾸던가 스타크래프트에서 마린, 히드라 등이 하는것처럼 공격모션만 취하고 적의 몸에 이펙트가 터지는 방식을 취할지도 고민해봐야한다.
느낀 점
공격로직 구현에 대해 생각지도 않고 있다가 맡게 되어 부담이 되었지만, 성장할 수 있는 계기가 되었다.
이전까지는 제대로 작동하지 않는 부분을 찾아 디버그를 찍는 것에 어색함이 존재했는데, 함정을 구현하면서 몇시간동안 디버그를 찍어보니 디버그에 대한 어색함은 확실히 준 듯 하다.
아무튼 1차 데드라인까지 구현해야할 기능들을 어찌저찌 구현해냈다.
2차 데드라인까지 게임의 완성도를 높여 재밌는 게임이 나올 수 있도록 해야겠다.
화이팅!