[C#, 유니티] Unity 3D_FPS

2022. 8. 16. 17:57코딩 2막 <C#개념편>

728x90

FPS(First-person shooter)

사용자의 시점이 1인칭인 슈팅게임을 뜻한다

대표적으로 콜오브듀티, 배틀필드, 서든어택과 같은 게임들이 있다

 

FPS의 핵심은 캐릭터가 바라보는 시점이다

플레이어를 실제로 움직였을때

돌아다니면서 보이는 상황들을 해주는 메인카메라는 플레이어의 자식으로 넣어주는게 좋다


플레이어의 움직임

그럼 먼저 플레이어의 이동 컴퍼넌트부터 짜보겠습니다

FPS의 게임 특성상 CharacterController를 사용하는게 좋겠습니다


local 스페이스와 global 스페이스의 차이

전역공간(global space)이라 함은 월드의 중심이라는 절대 기준이 존재하는 공간을 말한다

전역공간에서 X, Y, Z축 방향을 정하고 좌표를 계산한다

 

유니티에서는 공간모드를 변경하고자 할때 transform 기즈모 전환버튼을 사용한다 

그것은 유니티툴 상단을 보면 피봇(Pivot)과 센터(Center)를 선택할 수 있고,

로컬(Local)과 글로벌(Global)을 선택할 수 있다

 

Pivot과 Center의 차이는 Pivot은 오브젝트의 실제 기준점을 기준으로 오브젝트를 배치하지만,

Center의 경우 눈으로 보이는 중점을 기준으로 오브젝트를 배치한다

일반적으로 Pivot을 체크해두면 된다

 

그리고 Local과 Global의 차이는 Gizmo 표현 방식에 있다

로컬은 상대적인 좌표인 반면 글로벌은 절대적인 좌표라고 보면 된다

Local의 경우 특정 오브젝트를 기준으로 기즈모의 평행이동툴이 생성된다

하지만 Global의 경우 전역공간의 실제 축을 기준으로 기즈모 평행이동툴이 생성된다

FPS 게임의 특성상 물리적 영향을 받지않아도 되기때문에

CharacterController을 써서 플레이어의 움직임을 구현하겠습니다

 

그리고 유의할 점

위아래로 움직이는 건 Y축으로 생각할 수 있지만, 

회전을 하는것은 X축 자체가 회전을 하는 것이기 때문에

위아래 표현을 하기 위해선 X 축의 회전이 필요하고,

좌우를 하기 위해선 Y축을 회전시켜야 한다.

PlayerMovement 스크립트


플레이어의 시점

그 다음 플레이어 카메라 스크립트를 만들어서 카메라에 추가하겠습니다

마우스의 움직임에 따라 움직이는 카메라 시점을 구현하고자

mouseX와 mouseY를 변수로 넣습니다

그리고 마우스의 민감도를 추가해주었습니다

PlayerCamera 스크립트

Quaternion

여기서 중요한 포인트는 오일러를 쓰지않고 Quaternion을 사용했다는 점이다

기하학적인 부분이기 때문에 오일러 대신하여 쿼터니언을 사용한 이유에 대하여 가볍게 짚고 넘어가도록 하자

 

짐벌 락(Gimbal Lock)
- 총 3개의 짐벌을 이용하여 회전하는 3차원 공간에서 두개의 짐벌이 겹쳐질 경우 회전축 하나가 사라지는 현상을 말한다
- 겹쳐진 두 개의 축을 더 이상 움직일 수 없게된다는 의미가 아니라 그 두개가 하나의 축으로 합쳐져서 각각 회전시켜도 같은 축을 기준으로 회전하게 된다는 의미이다.
- 물체가 회전하면 물체의 좌표계가 함께 회전하고 만약 회전하기 전 좌표축과 회전한 후 좌표축이 일치하면 데이터가 소실된다

*참고 - Quaternion을 써야하는 이유 (오일러의 한계)

https://blog.naver.com/PostView.nhn?blogId=dj3630&logNo=221447943453&parentCategoryNo=&categoryNo=108&viewDate=&isShowPopularPosts=true&from=search

 

짐벌락과 오일러 각 (gimbal lock, euler angles)

개요 오일러 각이란? 짐벌락이란? 짐벌락은 왜 생기나? 1. Gimbal 이란? 출처 - [http://ko.wikipedia.org/wiki/%EC%A7%90%EB%B2%8C] 이것이 바로 짐벌이다. 위키에는 단일 축으로 물체가 회전하도록 중심축을 가..

handhp1.tistory.com


슈팅

 

탄환의 판정이 중요한가 아니면 탄막효과가 중요한가에 따라 슈팅게임이 달라진다

탄막은 폭탄이나 탄환(포탄, 총탄 등)을 마구 뿌리는 행위를 일컫는 일본식 표현

 

그래서 슈팅에서 raycast 기반의 슈팅게임이 나온것(탄막슈팅이 아닌 슈팅게임들은 raycast를 사용)

충돌을 예측하기위해 raycast를 씀

 

(총기는 에셋스토어를 통해 다운르도 받아 임포트해주었습니다)

WeaponHolder라는 위치 밑에 에셋을 추가한다

카메라도 움직이면 총기도 같이 움직이게 하기 위해

메인카메라에 WeaponHolder를 빈스크립트를 추가해준것

 

FPS는 플레이어의 총구가 아니라 눈(카메라)에서 쏘는 방향으로 나간다는 점에 유의 

 

review

공감해주셔서 감사합니다

 

728x90