본문 바로가기
프로젝트A

상태머신을 만들어보자 #1

by IX. 2023/10/15 02:22:08

10.6

게임 룰은 얼핏보면 단순한데 어떤 복병이 있을 지 모르겠다. 미래의 고민은 미래에 해보고 일단 짜보자.

 

오늘의 깨달음

유니티 인풋메니저의

Gravity는 키를 놓았을 때 0으로 돌아오는 시간,

Sensitivity는 키를 눌렀을 때 1로 가는 시간이다.

1000으로 하면 즉각반응이다.

기존엔 점프를 구현할 때 프레임마다 중력을 빼는 방식을 썼는데,

이랬더니 프레임이 줄어들면 점프높이가 달라지는 현상이 있었다.

그렇다고 유니티의 리지드바디를 사용하자니 충돌 시 덜거덕 거리는 게 마음에 안든다.

 

좋은 방법이 없을까 싶어 삼각함수를 응용했더니 깔끔하다.

타겟프레임 60
타겟 프레임 20

10.13

기본 이동과 방향전환을 완료.

 

유니티의 내장 상태머신을 일찍 버리길 잘했다.

스테이트는 열거형으로 저장한다. 방향전환이나 데미지 처리 등을 위해 서브스테이트를 둔다.

이 개념까지는 유니티 내장 FSM과 같다.

하지만 스테이트에 더 많은 정보를 저장해야 한다.

점프 높이, 전진 거리, 연계기 처리를 위한 스테이트 레벨 등.

 

무엇보다 내장 FSM은 전이 시 스테이트가 무엇인가? 에 대한 정보가 불분명했다.

이 점이 가장 마음에 안들었던 점이다.

게임템포가 무지 빠르기 때문에 스테이트는 1초만에 수시로 변할 수 있는데, 이것에 대한 정보를 안준다.

 

하지만 유니티 애니메이션 시스템이 애니메이터를 거치지 않을 수는 없기 때문에 울며 겨자먹기로 애니메이터는 쓰긴 써야 한다. 레거시는 언제 사라질 지 모르고...(이미 사라졌던가?)

 

10.17

유니티의 물리엔진 계산은 FixedUpdate에서 이루어진다. 따라서 물리계산 후에 정확한 계산을 수행하려면 Update()대신 FixedUpdate()에서 처리해야 한다.

하지만 물리계산이 무거운지 이것이 매프레임 일어나지 않는다. deltaTime대신 FixedDeltaTime으로 계산할 경우 깔끔한 궤적이 나오지 않는 문제가 있다. Fixed를 사용하면 물리시뮬레이션을 수행할 시의 틱틱거림이 나타난다.

 

이를 보완하려면 Update()에서 충돌을 계산해야 한다. 그렇다면 RigidBody가 아니라 수동으로 충돌을 계산하는 편이 좋겠다. 박스컬라이더에서 필요한 정보를 모두 주기 때문에 이는 어려운 것이 아니지만, 이게 맞나? 하는 의문은 든다.