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
레이어 마스크
유니티 레이어 마스크는 배열이나 리스트로 받아올 필요가 없다.
인스펙터에서 여러 레이어 마스크를 선택하면 각 레이어를 비트 연산을 해서 결합한 레이어로 알아서 처리해준다.
이걸 몰랐어서 레이어를 리스트로 받아야 하나 하고 고민하다 찾아보니 이렇게 편리할 수가 없다.
스크립터블 오브젝트
그리고 자동차에 할당되는 여러 값들 (EX. 최대 속도, 가속도, 댐퍼 상수 등..)을 그냥 클래스에서 Serialize Field로 받아오는 것보다 스크립터블 오브젝트로 나중에 다른 차를 추가했을 때 이 수치 조정해서 양산 가능하게 처리하는 것이 좋아보인다.
또 데이터 양이 많은 편이니까.. 이렇게 하면 메모리적으로도 분명 이득이 있을 것이라 판단해서 수정했다.
그리고 Suspension에 사용되는 변수들이 Movement와 겹치는 것이 있었기 때문에 Suspension을 MonoBehavior가 아니라 일반 클래스로 선언해서 기능만 작동 시키게끔 수정했다. (컴포넌트로 부착하지 않는다. Movement 안에서 새로 생성한다.)
이렇게 하면 Suspension을 적용하지 않는 객체는 Movement에서 다른 자식 클래스를 생성해 사용하면 되고, 모든 ArcadeCarMovement를 사용하는 객체들은 서스펜션을 하게 된다.
스크립터블 오브젝트 데이터에 서스펜션 관련 변수도 넣자.
전부 이동 관련 연산 등을 하기 위한 변수들이다.
VFX는 아예 별개의 기능이므로 따로 뺐다.
이전 포스트에서 인스펙터 창에 변수가 정말 많은 걸 보여줬는데, 수정된 결과물을 보자.
이런저런 수치들 다 사라져서 좀 보기 편해졌다.
뭐.. 사람마다 방식의 차이가 있겠지만, 너무 많은 변수로 눈이 혼란해지는 것보다 아예 따로 분리해서 보게 하는 게 더 가독성이 좋다고 생각한다.
차량 흔들림 구현하기
기존 속도를 추가하는 벡터는 바닥면에 투영해서 적용하고 있었다.
이거 말고, 위 그림처럼 중심점에서 약간 아래 앞쪽 점 기준으로 힘을 주면, 차량이 약간씩 흔들릴 것이다.
너무 심하게 하면 이상하니까 적당히 조절해보자.
이제 미루고 미뤘던 오류를 해결해보자.
마찰력
일단 마찰력을 추가하자. 지금 도로는 너무 얼음장 같이 미끄러진다.
맞닿아있는 도로의 종류에 따라 마찰 계수를 조정하는 코드를 추가하고자 한다.
일단 기존 movableMask에 이동 가능한 레이어를 추가하자.
유니티의 LayerMask는 정수 값으로, 비트 연산을 통해 해당 레이어에 해당하는지를 알아낸다.
0이 32개 있는데, 이중에 1이 있는 것만 확인하는 것이다.
Road, Grass, Ice
일단 이 세 개로 하고, 나중에 뭐 더 추가할 게 있으면 더 추가하자.
사실 지금 키보드 눌렀을 때 가속되는 것은 만족스럽다.
그래서 키보드에서 손을 뗐을 때 감속되는 수치를 조정하려고 한다.
이를 위해서 moveInput에 들어온 값이 0이면 전진 후진 입력이 없는 것이므로 마찰력을 통한 감속 처리를 추가로 진행하면 될 것이다.
또, 기존 감속 코드가 현재 차량의 속도를 기준으로 하고 있지 않아서 감속 수치를 늘리면 갑자기 뒤로 가버리는 현상이 발생하므로 특정 속도 이상일 때만 감속을 하도록 했다.
공중에 뜨는 현상
중력이 너무 약하다. 공기저항도 작게 해뒀고 무게도 1000이지만 왜 이렇게 중력이 약한지... 체공 시간이 좀 긴 편인 것 같다.
무게도 늘려보고, 이것저것 해봤는데 그냥 제일 간단하고 제일 확실하게 변경하는 법이 중력을 두배로 늘리는 거였다.
이제 오르막길 타다가 날라가는 일은 거의 없어졌다.
바퀴 빠져나가는 현상
이거는 크게 고칠 건 없다.
지금 배치된 트랙이 옆면에 존재하는 벽도 모델에 같이 포함된 객체들인데, 여기에 메쉬 콜라이더로 충돌 검사를 하고, 동시에 해당 벽까지 이동 가능한 Road 레이어 마스크로 인식이 돼서 차량의 속도가 너무 빨라졌을 때 프레임 단위로 잠깐 벽 위치까지 바퀴가 이동하게 되고, 그 바퀴가 해당 벽을 길로 인식해서 벽을 기준으로 바퀴 위치를 계산해서 그런 것이다.
그래서 벽을 전부 Default 레이어로 바꾸니 아주 잘된다.
그 외에도 바퀴가 너무 위아래로 많이 움직여서(바퀴 위치 바꾸는 걸 제한을 두지 않아서) 차체를 뚫고 위로 올라오는 버그도 고쳤다.
이제 진짜 이쁘게 터레인 만들고 트랙 배치하고 동물 나타나게 해야겠다.
동물 행동 패턴은 고민을 많이 했는데, 물고기 같은 건 바닷가 트랙 달릴 때 바다에서 포물선으로 튀어나오는 느낌?
뭐 그런거 차로 뻥뻥 날려버리면 점수가 더 올라가는.. 그런 느낌으로 생각중이다.
그리고 점수 내기 혼자하면 재미 없으니 차량 ai를 추가할 수 있으면 추가해보겠다. (기왕 Movement 클래스 만들어뒀으니 AIArcadeCarController 만들어서 돌리면 될 것 같긴하다.)
오늘은 마지막으로 플레이 영상 올리고 가겠다.
'유니티 > 유니티 프로젝트' 카테고리의 다른 글
Road Kill 개발 일지 3일차 - 코드 리팩토링 (0) | 2024.07.09 |
---|---|
Road Kill 개발 일지 2일차 - Skid Mark, Effect와 시원하게 동물 날려버리기 (0) | 2024.07.06 |
Road Kill 개발 일지 1일차(2) - 물리 관련 오류 해결 및 바퀴 애니메이션 구현하기 (1) | 2024.07.05 |
Road Kill 개발 일지 1일차(1) - 게임 기획 + 차량 서스펜션 구현 (0) | 2024.07.04 |
Unity 2D - Auto Battler Sample Project (0) | 2024.06.17 |