몬스터의 전투와 AI 구현, 애니메이션 등은 이전 게시글에서 상세히 설명했기 때문에, 간략하게 넘어가도록 하겠습니다.
본 문서에서는 기존에 작성한 몬스터 시스템을 이용하여, 어떻게 새로운 타입의 몬스터(보스)로 확장했는가에 대해 중점적으로 서술하겠습니다.
part1 게시글에서 설명했다시피,
몬스터는 몬스터의 데이터를 담은 Monster 클래스를 기반으로, MonsterManager 클래스에 의해서 제어관리 됩니다.
몬스터 클래스에는 체력과 공격력, 방어력, 몬스터 타입 등. 필요한 여러 정보를 저장하고 있으며, 몬스터 매니저는 이러한 몬스터 클래스 데이터를 기반으로, 몬스터 프리팹을 제어하는 역할을 합니다.
즉, 보스 몬스터 또한.
큰 틀에서 보자면, 기존의 방식과 크게 다르지 않습니다.
몬스터 클래스 데이터에 보스몬스터에 대한 데이터를 저장한다.
매니저를 이용해서, 보스몬스터를 제어한다.
보다시피, 몬스터 클래스에는 Boss에 대한 타입이 존재함을 알 수 있습니다.
이를 이용하여, 추가적으로 필요한 조건문을 삽입하여 보스몹만이 가지는 특징을 추가할 수 있습니다.
몬스터의 공격을 제어하는 Attack매니저는 MonsterAttack을 부모 클래스로 하여, 생성한 자식 클래스를 인스턴스화 하여, 해당 매니저에서 관리하기 때문에.
별도로 추가 작업을 할 필요는 없었습니다.
다만, 몬스터 매니저 내에서 수정해야하는 부분이 있었는데,
애니메이션 제어와 스턴/히트치 계산 파트였습니다.
에셋이 제공하는 애니메이션에 따라, 제어해야 할 애니메이션이 달라지기 때문에 일괄적으로 하나의 애니메이션 제어 함수를 사용하는 건 어려웠기 때문입니다.
그렇기에 MonsterAttack와 같이, 각 몬스터에 필요한 클래스를 자식 클래스 형태로 가져와, 부모클래스 주소에 인스턴스화 하여 저장하는 방식으로 코드를 확장했습니다.
업데이트와 경직치 계산함수 호출부는 위와 같이 수정되었습니다.
기존의 함수를 제거하고, monsterController 변수의 맴버 함수를 호출하는 방식으로 바꿨습니다.
부모 클래스의 MonsterAnimationController와 HitStrunAccumulate를 오버라이딩한, 자식 클래스. MonsterAniControl_type1 클래스의 맴버 함수 코드입니다.
다음은 MonsterAniControl_type2 클래스의 맴버 함수 로직입니다.
type1과 다르게, attack과 sturn, lookaround에 변경점이 있는 것을 확인할 수 있습니다.
현재 구현된 보스몬스터인 골렘은, 일반 공격과 스킬 공격으로 플레이어를 공격합니다.
일반공격의 경우에는, 골렘의 front 방면에 위치한 콜라이더를 이용하여 충돌을 감지. 데미지 계산을 합니다.
스킬은 장판을 통해서, 타격 포인트를 가시적으로 나타내고. 일정 시간 이후에 장판 위에 존재하는 적에게 타격을 주는 형식으로 구현했습니다.
보스 몬스터, 골렘의 공격을 제어하는 AttackManager 입니다.
필요한 제어변수(bool)와 time 계산용 float 변수를 초기화합니다.
skillCool은 12초로. 12초마다 장판을 터뜨리는 공격을 합니다.
MonsterAtkColliderMng는 장판에 걸려있는 콜라이더 매니저 함수(객체)를 저장하는 배열입니다.
최초에는 gameObject.SetActive(false)로 하여 비활성화해둡니다.
공격 AI는 코루틴을 이용하여 구현하였으며 업데이트에서 호출되어 동작합니다..
공격 코루틴이 동작 중이라면 제어 플래그 변수를 체크하여 리턴합니다.
다만, 공격 범위 내에 적(플레이어)이 존재하지 않는다면, 각 제어 플래그 변수를 리셋해줘서, 코루틴을 다시 동작시킬 수 있도록 합니다.
코루틴으로 구현된 AI는 다음과 같습니다.
먼저, 공격 범위 내에 플레이어가 있는지 판단, 그리고 동시에 IsChageReturn 변수가 false인지 판단합니다.
(IsChageReturn는 부모 클래스인 MonsterAttack에서 구현된, 공격 범위 내에 플레이어가 없을을 때, 추적하는 함수를 제어하는 플래그 변수입니다. 이는 스킬과 같은 특수 동작 도중에, 플레이어가 공격 범위를 빠져나가더라도 동작이 중단되지 않게 하기 위함입니다.)
모든 조건을 만족한다면, time값을 체크하여 스킬 쿨타임을 만족했는지 확인. 만족한다면,스킬을 구현하고, 만족하지 않는다면 일반 공격을 합니다.
일반 공격은 레벨 변수에 따라서 1번과 2번 애니메이션 동작이 결정되며, 순환합니다.
일반공격과, 애니메이션의 동작 시간을 가져오는 함수입니다.
동작시간 리턴 함수는 선인장 몬스터와 버섯 몬스터에서 구현했던 함수를 그대로 사용했기에, 넘어가겠습니다.(부모 클래스로 옮겨서 사용할 것입니다.)
AttackNormal은 현재 애니메이션 시간동안 대기했다가, attack 콜라이더 박스를 Off하는 기능을 구현했습니다.
모든 로직을 마무리 한 후에, 제어 플래그를 초기화 합니다.
스킬 공격 함수입니다.
동작 구조는 다음과 같습니다.
장판 활성화(콜라이더는 Off) → 애니메이션의 80%까지 대기 → 장판 콜라이더 On, 이팩트 효과 생성 → 나머지 20% 대기 → 장판 비활성화 → 플래그 변수 초기화
스킬 공격의 경우에는 OffSet 값만큼, 몬스터 Attack을 보정하여 최종 합연산 합니다.
기존의 공격 콜라이더 체크 함수에 offset 값에 의거하여 분기해, 함수를 호출하는 구조로 확장했습니다.
기존의 damage 계산 함수를 오버라이딩하여, offset 값을 보정하는 로직을 추가했습니다.