본문 바로가기
[ CODING STUDY ]/》유니티 실습

유니티 - [카메라 오브젝트 따라가기, 점프, AddForce, Velocity]

by MRG 2021. 5. 27.
728x90
반응형

▣ 먼저 여러분들이 원하시는 player 오브젝트와 Ground 바닥을 만들어주세요.

Ground오브젝트에 Tag를 꼭 ground로 바꿔주세요. 이건 나중에 점프를 중복해서 

하지 않기 위함 입니다. 

 

▣ 그리고 player에는 collider와 Ridgibody 그리고 스크립트를 넣어주세요.

 

▣ Main Camera 또한 스크립트를 넣어주세요. 

그리고 카메라가 공을 어떻게 보이게 따라갈지에 대한 위치를 지정해주세요.

카메라 위치는 잘 정해주셔야합니다. 그래야 그 위치로 카메라가 계속 공을 따라가게 하는 코드를 진행합니다. 

 

▣ 먼저 플레이어 스크립트를 작성하겠습니다. 

speed, jump 는 public 으로 지정하셔서 만들어주세요. 

우리가 유니티 에디터상에서 스피드와 점프를 조절하면서 진행하겠습니다. 

그리고 rid와 is_jump를 선언해주세요.

rid는 우리가 Rigidbody() 값을 통해서 플레이어를 움직이기 위함이고, is_jump 는 점프를 했는지 안했는지에 대한

유무상태와 중복 점프를 막기위한 코드입니다. 

 

▣ 자 그럼 이제 업데이트 함수안에 플레이어를 움직이는 코드를 작성해보겠습니다.

움직이는 코드는 여러가지 방법으로 작성해보겠습니다.

먼저 Translate() 함수입니다. 이건 플레이어에 위치를 실시간으로 바꿔서 진행하는 코드라고 생각하시면됩니다. 

new Vector3(x, y, z )값을 넣어주시면 되는데 

 

▣ 공을 움직여보시면 아시겠지만, 3D에서의 x,y,z 에 영역을 조금 다릅니다. 

우리가 포지션을 이용해서 공을 어떻게 움직일지 값을 조절해보면 x와, z값을 움직여야 우리가 원하는 값으로 움직이는걸 확인할 수 있습니다. 

 

▣ 그렇기 때문에 (new Vector3(x, y, z)))에 값중 x, 와  z에 값을 조절해주시면 됩니다.

그런데 저는 여기서 Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")을 사용했습니다.

이건 x, y 값이라고 생각하시면 되는데요.

 

▣ 에디터에 돌아가셔서 Edit메뉴에 Project Settings를 클릭해주시면

 

▣ 메뉴중에 Input Manager라는 값이 있습니다. 

여기서 Axes안에 Horizontal, Vertical이라는 메뉴가 있는걸 확인할 수 있고,

여기를 열어보면 버튼에 대한 정보 그리고 중력 Type 등이 보일겁니다. 

쉽게 이야기해서 이건 유니티에디터에서 지원하는 형식들이라고 지정해주시면 됩니다. 

 

▣  다시 말해 Input.GetAxis("Horizontal"), Input.GetAxis("Vertical") 것들은 유니티에서 지원해주는 

오른쪽, 왼쪽, 위, 아래방향키, a키, d키, w키, s키, 조이스틱등에 코드가 이미 만들어진 것이며, 

그 해당 키값을 누르면 값이 1로 반환됩니다. 그렇기 때문에 우리가 2D게임에서 

움직이는 코드를 진행했을때와 같이 하나하나 input.GetKey(KeyCode.A) 이런형식으로 지정하지 않아도 된다라는 이야기입니다. 

 

▣ 그렇게 x, z 값에 각각 Input.GetAxis("Horizontal"), Input.GetAxis("Vertical") 값을 넣어주시고, 아까 우리가 넣어떤 

speed 값을 넣어주신다음에 Time.deltaTime으로 결과시간을 곱해주면 사양에 맞게 잘 움직이는걸 확인할 수 있습니다. 

 

▣ 이번에는 Ridgidbody 값을 통해서 AddForce(), velocity()함수를 통해 힘을 줘서 코드를 진행해보겠습니다.

우선 둘에 차이는 AddForce()는 오브젝트에 질량에 영향을 받고 같은 힘을 주면 그 영향 받은 값에 따라 계속 다르게 힘을 주는 형식이라면 velocity()함수는 같은 힘을 가해도 오브젝트 질량에 상관없이 동일한 힘을 주는 함수입니다. 

둘에 사용방법은 거의 비슷합니다. Translate()함수와 동일하게 x, z 값에  x = Input.GetAxis("Horizontal"), y = Input.GetAxis("Vertical") 값을 원하는 방향으로 넣어주시면 됩니다. 

 

▣ 그렇게 테스트를 해보면 둘다 다르게 힘을 가해서 플레이어가 움직이는걸 확인할 수 있습니다. 

 

▣ 이번엔느 점프입니다. 점프는 아까 우리가 사용했던 AddForce()함수에 y값으로 힘을 주게 해주시면 되는데

이렇게 그냥 코드를 끝내면 점프가 무한으로 되는걸 확인할 수 있습니다. 그렇기 때문에 아까 우리가 공부했던

is_jump 변수로 상태가 true가 아닐경우 점프하게 합니다.

그럼 이제 어떤 상태일때 true로 바꿔야 겠죠. 간단하게

아까 땅에 닿이면 true가 바뀌게 코드를 작성했습니다. 

OnCollisionEnter()함수를 통해 collider가 닿인 값이 collision값에 들어가고 

그중 Tag 태그가 ground라면 is_jump가 false가 되게 하였습니다. 

그럼 점프를 하는 코드에는 한번 점프를 하면 is_jump가 true가 되게 해주세요. 

저장을 한 후 확인을하면 땅에 닿지 않는 이상 다시 점프하지 않습니다. 

 

▣ 이번에는 카메라에 대한 스크립트 입니다. 

카메라는 간단합니다. 카메라에 위치에 카메라와 플레이어에 거리를 더하면 됩니다.

그럼 그것만큼 멀리 떨어져서 계속 따라오게 됩니다. 

여기서 중요한건 LateUpdate()함수입니다. 

이건 업데이트 함수가 끝나고 진행하는 함수라고 생각하시면 됩니다.

보통 카메라 코드에는 LateUpdate()함수를 사용합니다. 

그리고 이부분이 이해가 안되실꺼 같아 debug함수로 거리를 출력하는 코드도 넣었습니다. 

 

▣ 확인을 해보면 이렇게 거리를 더했을때 바뀌는 코드도 확인할 수 있습니다. 

 

▣ 확인을 해보면 이렇게 공이 움직일때마다 카메라도 자연스럽게 같이 따라오는걸 확인할 수 있습니다.

728x90
반응형

댓글