라이프 사이클 중에서 Update를 추가하였습니다.
이 곳에 점프키 입력을 받을 것입니다.
이동과 마찬가지로 InputManager 에
설정되어있는 'Jump'를 사용합니다.
점프는 축 이동이 아니기 때문에 GetButtonDown 을 사용합니다.
키를 눌렀으면 true, 안누르면 false 값을 내어주죠.
이와 같은 입력 방식 함수는 아래와 같습니다.
------------------------------------------------
1-1. GetButton
: InputManager에 설정된 키 입력 처리.
: 누르고 있으면 연속적으로 값을 받음.
?
1-2. GetButtonDown
: InputManager에 설정된 키 입력 처리.
: 키를 누를 때만 한번 값을 받음.
1-3. GetButtonUp
: InputManager에 설정된 키 입력 처리.
: 눌러진 키를 뗄 때, 한번 값을 받음.
2-1. GetKey
: 키보드의 KeyCode로 키 입력 처리.
: 누르고 있으면 연속적으로 값을 받음.
2-2. GetKeyDown
: 키보드의 KeyCode로 키 입력 처리.
: 키를 누를 때만 한번 값을 받음.
2-3. GetKeyUp
: 키보드의 KeyCode로 키 입력 처리.
: 눌러진 키를 뗄 때, 한번 값을 받음.
-------------------------------------------------
전역변수 isJumping 은
점프키를 눌렀다는 증거(?)를 저장해두기 위한 변수입니다.
이건 나중에 점프 함수에서 사용할 것입니다.
이제부터 키 입력에 대해서는 모두 Update 안에서 기술합니다.
각각의 프레임 안에서 정확한 입력을 받기 위함이죠.
때문에 5장에서 다루었던 방향키도 모두 Update로 옮겨놓았습니다.
이로서 키 입력과 물리 효과를 완전히 분리했네요.
이제 점프의 물리 로직을 한번 만들어봅시다.
맨 처음에는 점프키를 눌렀냥, 안눌렀냥 조사를 먼저 합니다.
누르지 않았는데 로직이 실행되면 안되니까
return 키워드로 조용히 돌려보냅니다.
마지막 줄은 점프를 한번 완료했으니
점프를 마친 상태로 되돌려주는 것입니다.
(이 로직이 없으면 점프 한번 하는 순간, 우주로 날아갑니다!)
가운데가 실제 점프 로직입니다만,
일단 5장에서 배운 것을 응용해보았습니다.
여기서 생소한 녀석이 보이는데요.
Vector3 에서는 기본 방향값을 제공해주고 있답니다.
우리는 위로 올려줄거니까 up을 사용하겠습니다.
간단하게 점프 로직이 완성되었네요.
이제 게임 안에서 뛰어보겠습니다.
(내가 원하는 점프는 이게 아닌데..)
점프를 하긴 하는데
순간이동하는 것처럼 무언가 어색한 느낌이 듭니다.
오브젝트를 단순히 높이만큼 이동만 시켜줬기 때문이죠.
그럼 이번엔 다른 방법을 써보겠습니다.
AddForce ( Vector, ForceMode)
이것은 정해준 방향으로 힘을 가해주는 로직입니다.
첫번째 매개변수로 방향값이 있는 벡터를 넣고,
두번째에는 포스모드를 넣어줍니다.
포스모드는 총 4가지가 있는데
우리는 순간적인 힘이 필요하기 때문에
Impulse 모드를 사용하겠습니다.
이제서야 진짜 점프같은 점프를 하네요.
물리엔진을 사용하는 환경에서는 이렇게 포스를 사용하는 쪽이
훨씬 자연스러운 연출을 구현할 수 있답니다.
게임 안에서는 수많은 이동 이벤트가 발생하지요.
리지드바디의 MovePosition 과 AddForce 의 차이점을 잘 이해하신다면,
계획했던 움직임 그대로 구현하실 수 있을 것입니다.
그럼 지금까지의 코드를 한번 주욱 살펴보도록 해요.
캐릭터를 움직이면서 점프하다보면..
캐릭터가 자꾸 넘어질 것이다.
그것은 RigidBody의 회전축을 고정하지 않았기 때문이다.
아래의 이미지처럼 고정 해주도록 하자.
'Game Programming > Unity' 카테고리의 다른 글
Unity - 단축키 (0) | 2017.05.24 |
---|---|
Unity - Logitech Extream 3D Pro 키 세팅 (0) | 2017.05.23 |
Unity - 게임 종료하기 (0) | 2017.05.19 |
Unity - Logo Scene 만들기 (0) | 2017.05.19 |
Unity - Public 필드 선언과 [SerializeField] 선언의 차이 (0) | 2017.05.19 |