유니티/유니티 프로젝트

Road Kill 개발 일지 1일차(1) - 게임 기획 + 차량 서스펜션 구현

강목근 2024. 7. 4. 21:36

https://github.com/khsfashi/Road-Kill

 

GitHub - khsfashi/Road-Kill: 유니티 3D를 통해 레이싱 게임을 제작합니다.

유니티 3D를 통해 레이싱 게임을 제작합니다. Contribute to khsfashi/Road-Kill development by creating an account on GitHub.

github.com

 

유니티 3D를 통해서 게임을 개발한 경험이 없어서, 짧은 시간 동안 빠르게 게임을 제작해보고자 한다.

 

아케이드 레이싱 게임을 만들 건데, 갑자기 이런 생각이 왜 들었냐면,,

 

유니티 에셋스토어 Quirky Series - Free Animals Pack 이미지 (출처: https://assetstore.unity.com/packages/3d/characters/animals/quirky-series-free-animals-pack-178235)

이 멍청하게 생긴 동물들을 봐버렸기 때문이다.

저 동그란 눈과 서있는 자세를 봐라. 정말 열받게 생겼다.

 

그래서 저녀석들을 어떻게 처리할까 고민했다.

처음에는 1인칭 게임을 만들어서 몽둥이를 휘둘러 날려버리는 걸 생각했는데, 별로 재미가 없을 것 같아 폐기했다.

이런저런 생각을 떠올리다가, 옛날에 '다함께 차차차'를 플레이했던 기억이 떠올랐다.

부스트 아이템을 획득하면 자동차를 전부 날려버리면서 즐거움을 느꼈었기에, 비슷한 느낌으로 가보고자 한다.

 

기획

  • 씬 구성
    • 타이틀 화면 - 게임 시작, 종료 버튼, 가능하면 옵션도?
    • 인게임 - 정해진 코스가 나오는 장면, 트랙 및 동물 배치, 트랙 완주 시 결과 띄우기 (최고 기록 갱신 기능)
  • 플레이어
    • 방향키로 전진 및 회전, Shift로 드리프트
    • 일정 속도 이상이 되면 속도감이 나는 이펙트
    • 드리프트 시 이펙트, 가능하면 트랙 위에 자국 남게
    • 아케이드 레이싱 자동차의 물리 구현하기 *가장 중요!
  • 동물
    • 트랙 위에 갑자기 난입하는 용도 (어느 시점에 어떻게 난입하는지는 생각을 좀 해봐야 한다.)
    • 자동차와 부딪히면 위치 값으로 반대방향 벡터 계산해서 날려버리기 (자동차 속도에 따라 강도 조절)
    • 아케이드라서 정말 세밀한 물리 계산은 필요 없다.
  • 추가적으로 구현하고 싶은 것들
    • 미니맵
    • 트랙 선택 (얼음 트랙이나, 뒤에 용암 쫓아오는 트랙이나, 동물이 정말 많이 나오는 트랙 등...)
    • 멀티 플레이

 

이제 개발을 해보자.

 

자동차 구현

일단 가장 먼저 할 것은 자동차 구현이다. 

당장 모델 넣고 하기보다는, 큐브로 좀 테스트 하면서 물리 관련 자료를 찾아보자.

 

https://www.youtube.com/watch?v=LG1CtlFRmpU

 

좀 오래되긴 했는데 내가 처음 상상한 아케이드 레이싱의 물리와 가장 흡사하다.

밑으로 레이를 쏴서, 자동차 물리를 구현한다. 

사실 영어 실력이 뛰어난 편은 아니라서, 좀 천천히 여러번 보면서 이해하는 것이 중요했다.

일단 저 영상처럼 큐브로 테스트를 해보자.

 

뭔가 되고 있다.

아직 좀 이상하긴 한데 뭔가 되고 있다.

둥둥 떠다니는 부유체 같기도 하고...

서스펜션 구현에서 스프링의 물리 연산을 추가했다. 각 바퀴에서 발사한 레이를 기준으로 튕겨나가게 했다.

자동차 질량은 지금 1000으로 설정되어 있고, 이것저것 에디터에서 수치 조절하면서 적당한 크기로 맞추고 있다.

 

이제 계속 튀기만 하니까 댐퍼를 추가해보겠다. 스프링과 댐퍼의 stiffness는 둘다 에디터에서 설정이 가능하다.

추가하고 보니까 적당히 잘 된 것 같아 만족스러웠는데, 좀 하다보니까 문제가 생겼다.

 

차가 뒤집히면 그대로 눕는다.

차가 뒤집히면 그대로 누워버리는 게 문제였는데, 아까 참고한 영상 뒤쪽에서 차량 무게중심을 바꾸라고 한 게 떠올랐다.

rigidbody의 centerOfMass를 바꾸면 무게중심이 바뀔 테니까... Start할 때 객체 무게중심을 바닥면쪽으로 바꾸게 해야겠다.

와우 아주 나이스다

뒤집혀도 무게중심이 차량 기준 바닥면 쪽에 존재해서 다시 뒤집힌다.

사실 계속 뒤집다보면 위와 똑같은 현상이 다시 발생하기도 하는데, 생각하기에 이동 관련 물리 연산을 추가하고 나면 발생하는 경우가 좀 많이 줄어들지 않을까 하는 생각이다. 

차가 뒤집혔을 때 아무 입력도 안하진 않을 거라 생각해서...

 

일단 저 상태로 두고, 차량을 위한 다른 것들을 구현한 다음 생각해보려고 한다.