유니티 점프 구현 - yuniti jeompeu guhyeon

오늘은 점프를 구현해보려고 합니다.

바로 실습하겠습니다.

일단 바닥을 생성합니다.

Hierarchy에서 오른쪽 클릭해서 3D Object - Plane 합니다.

유니티 점프 구현 - yuniti jeompeu guhyeon

다음은 점프할 객체를 생성합니다.

Cylinder를 이용하겠습니다.

3D Object - Cylinder

유니티 점프 구현 - yuniti jeompeu guhyeon

처음에는 약간 위로  떠있는 상태입니다.

그렇기 때문에 Cylinder의 초기 위치를 지정합니다.

유니티 점프 구현 - yuniti jeompeu guhyeon

다음은 Rigidbody를 추가합니다.

객체에 힘을 가해서 점프와 같이 보이게 하려고 합니다.

유니티 점프 구현 - yuniti jeompeu guhyeon
유니티 점프 구현 - yuniti jeompeu guhyeon

힘을 가다 보면 객체가 쓰러지는 현상이 발생할 수 있습니다.

이것을 방지하기 위해서 Rigidbody속성을 설정합니다.

constaints(제약) 설정을 보시면 Freeze Rotation에 x, z를 체크합니다.

x, z축으로 회전을 막는다는 의미입니다.

유니티 점프 구현 - yuniti jeompeu guhyeon

스크립트 추가

Cylinder에 스크립트를 추가합니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Player : MonoBehaviour

{

public float m_fForce = 5.0f;

void Start()

{

}

void Update()

{

if (Input.GetKeyDown(KeyCode.Space))

{

GetComponent<Rigidbody>().AddForce(Vector3.up * m_fForce, ForceMode.Impulse);

}

}

}

cs

Rigidbody의 AddForce를 이용해서 객체에 힘을 가합니다.

객체의 위쪽 방향으로 5만큼의 힘을 가합니다.

ForceMode.Impulse는 질량의 영향을 받으면서 힘을 가하는 옵션입니다.

옵션은 다음과 같습니다.

Force rigidbody에 지속적인 힘 추가, 질량 사용.
Acceleration rigidbody에 지속적인 가속 추가, 질량 무시.
Impulse rigidbody에 순간적으로 충격 추가, 질량 사용.
VelocityChange rigidbody에 순간속도 변경, 질량 무시.

스페이스키를 입력하면 객체가 점프하는 것을 볼 수 있습니다.

근데 스페이스키를 계속 입력하면 계속 점프를 하는 것이 확인됩니다.

점프 중에는 스페이스 입력을 받지 않게 하기 위해서는 다음과 같이 구현할 수 있습니다.

Plane 오브젝트에 태그를 변경해야 합니다.

일단 태그를 추가하겠습니다.

유니티 점프 구현 - yuniti jeompeu guhyeon

"Plane"라고 태그를 만듭니다.

유니티 점프 구현 - yuniti jeompeu guhyeon

Tag를 Plane로 변경합니다.

유니티 점프 구현 - yuniti jeompeu guhyeon

그리고 스크립트를 수정합니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Player : MonoBehaviour

{

public float m_fForce = 5.0f;

bool m_bJumping = false;

void Start()

{    

}

void Update()

{

if (Input.GetKeyDown(KeyCode.Space))

{

if(!m_bJumping)

{

GetComponent<Rigidbody>().AddForce(Vector3.up * m_fForce, ForceMode.Impulse);

m_bJumping = true;

}

}

}

void OnCollisionEnter(Collision collision)

{

if (collision.gameObject.CompareTag("Plane"))

{

m_bJumping = false;

}

}

}

cs

스페이스 키를 누를 때 점프 중이 아닐 때만 점프가 가능하도록 하고, AddForce함수가 호출되었을 때, 점프 중으로 m_bJumping 값을 true로 변경합니다.

OnCollisionEnter함수를 사용해 오브젝트가 바닥과 충돌했을 때를 나타냅니다.

OnCollisionEnter는 충돌했을 때 발생하는 함수입니다.

충돌한 오브젝트의 태그가 "Plane"일 때 m_bJumping 값을 false로 만들어서 점프가 가능하도록 합니다.

이렇게 구현하면 여러 번 점프가 불가능하도록 구현할 수 있습니다.