본문 바로가기
프로그래밍/게임 개발

프로그래밍 「 게임 개발 편」스케이트보드 컨트롤러 — 제스처 인식

by grapedoukan 2023. 7. 4.
728x90

이번 주에는 몇 가지 시각적 개선 사항을 추가하고 플랫 그라운드 스케이트 트릭을 시작하기 위해 아날로그 스틱 제스처 인식을 만드는 작업을 시작했습니다.

이번 주에 중간 프레젠테이션이 있었기 때문에, 애니메이션 상태 시스템에 더 많은 것을 추가하여 엔진에서 촬영한 멋진 모션 캡처를 선보이기로 했습니다! 사용자가 컨트롤러 트리거 중 하나로 시작할 수 있는 두 가지 다른 잡기와 일반적인 움직임 및 점프를 위해 녹화된 밀기, 유휴, 올리 애니메이션을 추가했습니다. 다음은 그 중 일부를 과시하는 비디오입니다!

인디와 멜론이 애니메이션을 잡는 모습을 과시하다

프레젠테이션이 끝난 후 영화 시스템 작업을 시작했습니다. 예전에 아날로그 스틱 움직임을 시각화하기 위해 UI 요소를 만들었기 때문에 게임에서 작업하고 캐릭터에 부착하기 위해 C++에서 별도의 액터 컴포넌트로 플릭 시스템을 만들었습니다. 처음에는 사용자가 아날로그 시스템을 튕기는 방향을 감지하는 여러 가지 방법에 대해 연구했지만, 사용자가 플릭 콤보를 수행할 수 있는 간격이 짧기 때문에 아날로그 스틱이 원 주위에 부딪히는 지점을 감지하여 이 시스템에 대해 보다 단순한 접근 방식을 취하기로 결정했습니다.

아날로그 스틱이 가장자리에 가까운지 확인하는 기능을 만들어 기본을 달성했습니다.

bool UAnalogStickTrickSystem::IsCloseToEdge(const float x, const float y)
{
 double distance = std::sqrt(x * x + y * y);
 return std::abs(distance - 1) <= EdgeThreshold;
}

그런 다음 아날로그 스틱 값의 아크탄젠트를 취하여 원의 어느 부분에 있는지 확인합니다

int UAnalogStickTrickSystem::GetSection(const float x, const float y)
{
 float angle = std::atan2(y, x);
 if (angle < 0) {
  angle += 2 * PI;
 }
 float sectionSize = 2 * PI / numSections;
 float adjustedAngle = angle - offsetAngle;
 if (adjustedAngle < 0) {
  adjustedAngle += 2 * PI;
 }
 int section = static_cast<int>(adjustedAngle / sectionSize) + 1;
 return section;
}

이 기능을 사용하여 현재 콤보를 보유 할 배열과 가능한 콤보를 보유 할 배열을 설정하고 유효한 콤보가 수행되었는지 확인합니다. 스틱이 데드 존에 남아 있으면 시간 제한을 설정하고 현재 콤보를 종료해야 한다는 것을 빨리 깨달았지만 콤보를 녹음하고 위아래로 튕기는 올리를 수행할 수 있었습니다!

저는 이 시스템을 계속 반복할 계획이며, 디자이너가 관련 애니메이션과 함께 새로운 콤보를 쉽게 추가하여 재생할 수 있도록 사용자 지정 데이터 유형을 만들기 시작할 계획입니다!

항상 그렇듯이 내 코드에 대해 더 깊이 파고 싶다면 내 GitHub에서 공개적으로 사용할 수 있습니다. https://github.com/DylanNAron/SkateboardControllerPPP

728x90