부트캠프

적 공격 액션 시스템 완성

noyyo 2023. 11. 8. 02:28

계속 머리를 싸매게 만들었던 공격 액션을 사용하는 시스템의 로직을 완성했다.

이 로직을 짜면서 부딪힌 큰 문제 몇 가지가 있다.

 

1. 관리를 어디서 해줄 것인가.

적의 이동 부분을 상태머신을 이용해서 구현을 했었다. 여기서 공격 액션과 관련된 State를 만들어 추가하기에는 구조가 적합하지 않다는 생각이 들었다. 실행과 관련된 공통된 로직을 Base가 되는 State에서 작성할 수 있어서 로직으로만 보면 가능할 수 있지만 패턴의 종류가 구체화되고 나면 수치적인 부분을 조정하는 것은 인스펙터를 통해서 즉각적으로 수정할 수 있고, 따로 저장이 되기를 원했는데 State로 작성하면 인스펙터에 노출하기 위해 작업도 더 복잡해지고 수정이나 저장을 하기도 어렵고 하나의 타입으로 업캐스팅 하는 것도 문제라고 판단됐기 때문이다.

 

결국 공격 액션을 따로 스크립터블 오브젝트로 만들게 되었는데 이렇게 하자니 기존의 상태머신이 조금 문제였다. 이동과 공격에 들어가는 판정을 상태머신이 하고 있었는데 상태머신은 하나의 상태만이 있는데 공격 액션이라고 하는 새로운 행동이 추가되어서 조금 애매해지는 감이 있었다.

코드를 다시 처음부터 짤까 하는 고민도 있었지만 시간비용을 생각해서 상태머신이 공격 액션들을 관리하다가 실행할 때만 AttackState에 진입해서 실행하는 방향으로 구조를 고쳤다.

 

2. 액션 및 효과의 실행 여부를 어떻게 판단할 것인가.

공격 액션은 MonoBehaviour가 없기 때문에 코루틴과 같은 간편한 기능을 사용할 수 없었다. 덕분에 타이밍적인 이슈가 많이 있었지만 AttackState에 진입할 때, 나갈 때, 유지중일 때 각각 Start, End, Update등과 같은 메소드를 실행하도록 만들고 bool값들을 통해서 효과라던지 액션의 실행 여부를 판단하도록 구현했다.

 

문제는 공격 액션의 효과를 적용하는 시점이었는데 처음에는 직접 시점을 2초와 같이 입력해주는 방식을 생각했지만 이 방식이 구현은 쉽지만 문제가 생길 수 있었다.

공격 액션은 애니메이션을 재생하게 될 텐데 애니메이션과 효과를 적용하는 시점이 달라져서 의도치 않은 동작이 생길 확률이 높았다.

그래서 애니메이션의 실행 여부를 판단하고 그것을 토대로 효과가 적용될 수 있도록 구현하고자 했지만 애니메이션이 실행됐는지 판단하는 것 자체가 많이 어려웠다.

최종적으로는 AnimatorStateInfo를 가지고 fullNameHash값을 비교해가면서 현재 상태의 nameHash값이 바뀌었는지 체크하고, 또 애니메이션이 시작되었을 때 bool 값을 세팅하고 normalizedTime등을 이용해서 애니메이션이 실행되었는지, 어디까지 실행되었는지 판단할 수 있는 메소드를 작성했다. 이 부분이 버그도 가장 많이 발생했고 구현되는데 가장 오래 걸린 부분이었다.

 

3. 공격 액션을 실행하는 조건이 어떻게 되는가

거리만 맞으면 공격할지, 거리와 방향도 일치할지, 실행해야할 액션이 여러개가 있을 때 어떤 액션부터 실행할지, 액션을 결정하는 방식은 어떻게 할지와 같은 여러가지 조건들과 실행하기 전에 수행되어야 하는 행동들에 대해서 고민이 있었다.

실행하는 조건은 ActionCondition과 같은 클래스를 만들고 실행가능 여부를 확인할 수 있게 한 뒤 액션의 선택은 Chain이 되어서 무조건 바로 실행되는 액션, 실행 조건이 만족되어서 실행할 액션 목록에 추가됐다면 확정적으로 실행되는 액션, 실행할 액션 목록에서 확률적으로 실행되는 액션 등 여러 옵션을 줄 수 있게 했다.

그리고 액션을 실행하기 전에 적 캐릭터는 항상 대상 캐릭터를 바라보거나 사용 가능한 거리로 다가가는 ChaseState로 진입하도록 구현했다.

 

 

이런 문제점들을 겪으면서 느낀 바는 다음에 비슷한 시스템을 작성할 일이 생긴다면 스테이트머신을 사용하는게 아니라 적의 이동부는 CharacterMove같은 컴포넌트를 하나 만들어서 움직이는 부분을 따로, 행동하는 부분을 따로 작성하는게 더 좋지 않을까 하는 생각이 든다.

 

'부트캠프' 카테고리의 다른 글

중간발표  (0) 2023.11.13
1차 통합  (1) 2023.11.09
공격 패턴 시스템 구현  (0) 2023.11.03
적 공격 기믹 구상하기(feat 소통의 중요성)  (0) 2023.11.01
일정 영역을 넘어가면 돌아가는 적 AI  (0) 2023.10.27