먼저 Github Desktop에 프로젝트를 레포지토리와 연동시켜줬다. (6일 전에 미리 했지만 기록용으로 남김)
Camera : 플레이어 오브젝트의 회전과 줌&아웃 기능을 구현
Input : 마우스 입력, 키패드 입력 등 모든 입력을 받고 저장하는 부분
Data : 레이어, 콜라이더, PlayerSO, 모든 상태에 사용되는 모든 데이터(속도, 시간, 각도 등..)를 저장
States : 플레이어 오브젝트의 상태를 변경해주는 부분, 데이터로 저장된 속도,각도 그리고 프레임마다의 애니메이션를 정의해주는 등의 행동 수행
StateMachine : 플레이어 오브젝트가 상태에 따라서 직접 수행하는 부분, PlayerStatement 스크립트에서 구현한 인터페이스 메소드를 수행한다.
기본적으로 InputAction을 사용하여 입력을 지정해준다. InputAction에 접근하기 위해서는 Actions를 자신이 원하는 걸로 입력을 설정하고
PlayerInputAction.액션 맵의 이름 + Actions를 입력해서 접근해준다. 그리고 자동구현 프로퍼티를 사용해서 캡슐화를 하고 변수가 다른 클래스에서 범용적으로 값을 설정하는 것을 방지한다.
++ 참고로 자동구현 프로퍼티의 변수를 인스펙터 창으로 띄우려면 [SerializeField]를 그냥 사용하면 안되고
[Field: SerializeField]라고 정의 해줘야 한다. 또한, 데이터만 직렬화가 가능하다.
Rigidbody의 Rotation 값은 오로지 스크립트에서 통제한다. 아마도 Rigidbody 컴포넌트에서 가해지는 Rotation 값에 생길 수 있는 변수에 의해서 그런듯 하다. 그리고 선형보간을 활성화하여 이전 프레임에 트랜스폼을 추적해서 자연스럽게 이어지도록 해준다. 충돌 감지는 항상 Continuous를 사용하여 빠르게 움직이면 벽을 뚫지 못하도록 연속 감지를 해준다. Continuous는 동적 오브젝트의 콜라이더와 충돌하면 Fixed delta Time단위로 충돌을 체크하지만, 정적 메쉬 콜라이더와 충돌하면 연속으로 충돌을 감지할 수 있도록 해준다.
InputAction에서 설정한 맵에서 콜백을 보내면 ReadMovementInput() 메소드를 통해서 값을 읽어준다.
이 부분에서 가장 중요한 부분은 Rigidbody.velocity로 직접 속도를 제어하지 않고 Addforce()를 사용했다는 것이다.
유니티의 공식 문서를 보면 Rigidbody.velocity 대신에 Addforce를 사용하라는 설명이 쓰여있다. 그리고 jumping 같은 한 번에 Velocity를 바꿀 때와 같이 즉시적으로 속도 변화를 주고 싶을 때 Velocity를 사용하라는 것 같다. 오브젝트에 무브먼트를 줄 때 항상 velocity를 바꿔줬는데 AddForce로 바꿔야 할 것 같다.