잡기 준비작업

2.19

작업의 방향성을 정하는데 많은 시간을 소요했다. 사실 그동안 계속 고민해오던 문제이긴 하다. 결과적으로 쉬운 방법과 어려운 방법이 있고, 양자택일을 해야 한다. 방향을 정하면 돌아가지 못한다. 쉬운 방법은 모든 잡기를 대략적으로 비슷하게 만드는 것이고, 어려운 방법은 잡기마다 세트 모션을 만드는 것이다.

세트 모션을 만들 경우 잡기 모션 하나당 모든 캐릭터에게 이를 당하는 모션을 추가해주어야 한다. 모든 캐릭터가 잡기를 가지고 있을 테니 그 수는 곱절로 늘어난다. 때문에 처음엔 이를 고려하지 않았는데, 쉬운 방법을 선택하자니 마음이 동하지 않았다. 그래서 스스로 재앙을 만들었다.

시작하기 전에 몇가지 확인이 필요하다. Link로 애니메이션 제어가 되는가?

안된다. 링크로 연결된 객체는 그 무엇도 제어할 수가 없다. 그렇다면 블렌더를 2개 켜놓고 애니메이션을 바꿔서 저장 후에 리프레시하는 방법을 사용해야 된다. 게다가 씬에 같은 파일을 링크할 수는 없다. 흐음.. 그렇다면 같은 캐릭터일 경우 작업용 파일을 복사해서 사용하고, 모션을 만든 후에 합쳐야 한다. 조금 귀찮게 됐다.

컬렉션을 링크하면 Scene탭에 인스펙터가 보인다. 여기서 새로고침을 해주면 저장한 모션으로 변경된다.

먼저 코드 구현을 위한 더미 모션을 만들자. 앨리스는 힘이 세다는 설정이므로 집어 던진다. 이 때 필요한 모션이 다음과 같다.

  • 앨리스 : GrapplingPunch (Kick을 눌러 잡으면 모션이 달라야 한다.)
  • 달래 : GrappledAlicePunch , DamageGrappledFlying(이 모션은 Knockdown으로 연결되어야 한다.)

데미지 모션은 잡기상황을 벗어났을 때 공용으로 사용할 모션이다. 잡기는 여러형태가 있을 수 있다. 예를 들어 백드롭을 하면 DamageGrappledBackdrop이 되어야 할 것이다. 여기까지 고려해서 모션명을 정해야 나중에 삽질이 적다. 파이썬을 제외한 변수나 리소스명은 낙타문자를 사용하고, 숫자를 사용할 땐 가독성을 위해 양 옆으로 언더바를 붙인다.(숫자는 대체로 중요한 정보이다!) 오래된 내 습관이다.

머리가 굳었는지 오랫만에 코드를 보니 정신이 아득해진다. 내일 하자…

2.20

잡기는 가까이 있을 때 방향을 정하고 펀치나 킥을 누르면 발동된다. 하지만 한 가지 의문이 생긴다. 만약 두 캐릭터가 동시에 잡기를 했다면? 이 경우 Update를 먼저 도는 쪽이 이기게 된다. 대체로 데이터가 먼저 만들어지는 1P일 것이다. 그렇다면 1P에게 조금이나마 유리한 부분이 생기게 된다. 유저가 이걸 확인할 길은 없다. 잡기는 딜레이가 없기 때문이다. 때문에 그냥 ‘아차, 내가 늦었구나.’라고 생각하게 되고, 게임은 그럭저럭 돌아갈 것이다.

하지만, 이건 분명히 불합리하다. 격투게임은 원래 1프레임차이로 명암이 갈린다. 그렇다면 잡기에도 명확한 기준이 필요하고, 동시에 잡았을 경우, 공격이 무산되어야 한다. 때문에 2가지 모션이 더 필요하다. 잡기를 시도하는 것과, 동시에 잡았을 때 실패하는 것

  • GrapplingTry
  • GrapplingFail

재료를 더 준비했으니 코딩을 해보자.

러프한 구현. 여엉차!

2.21

작업을 하다보니 잡기를 한 쪽과 당한 쪽의 코드명이 헛갈리는 경우가 많았다. 이에 잡는 쪽은 Grappling, 잡힌 쪽은 Caught로 바꿔쓰기로 했다.

잡기 테스트. 아휴… 생각보다 많은 부분을 뜯어고치고 있다.

2.22

캐릭터마다 잡기는 모두 넣을 예정이지만, 미래는 알 수가 없다. 어쨌거나 강펀치 혹은 킥을 누르면 잡기를 수행하는데 이 데이터가 없을 경우 일반 공격이 나가게 하는 처리가 필요하다. 그리고 이걸 하려면 스테이트 매니저를 캐릭터별로 분리해야 한다. 좀 더 먼 훗날의 일인 줄 알았는데, 생각보다 일찍 분리해야 한다.

앨리스의 설정을 담은 초기화 함수를 만든다. 기본 데이터 위에 캐릭터 별로 다른 데이터를 얹는 식이다. 스테이트 구조체는 정보가 많아서 이를 일일이 컨트롤하기는 힘들기 때문에, 필요한 데이터만 선별해서 바꿔주는 식이다. 잡히는 정보가 없다면 해당기술이 없는 걸로 간주하고 그냥 근접공격을 내보낸다.

잡기든 다른 공격이든 넘어졌다가 일어났을 때 바로 잡히면 안되기 때문에, 약간의 무적시간을 준다. 무적시간은 state에 귀속되어 있지만, GetUp스테이트만은 예외다. 이로서 공격자는 재공격이 불리하게 되고, 피격자는 반격을 노릴 수 있다.

동시에 잡았을 땐 그 누구도 이득을 얻지 말아야 한다.

더미모션을 넣어놨더니 ‘앗..아…’하는 애매한 마무리가 되어버렸다.

예정했던 잡기용 코드 작업은 끝났다. 하지만 프로그램 작업으로 넘어온 김에 노션에 써놨던 작업을 마무리 하고 넘어가도록 하자.

댓글 남기기