본문 바로가기

Unity

Unity(유니티) 정리: 02.점프

이동에서 작성한 스트립트에 점프기능을 구현해보았습니다.


점프도 기본적으로는 이동과 같다고 생각했습니다.

GameObject에 Rigidbody컴포넌트를 추가해 중력를 적용해주고 이동에서 이용했던 방식을 응용했습니다.

1.Transform.Translate이용

--------------

if (Input.GetKey(KeyCode.Space))

{

transform.Translate(Vector3.up * Time.deltaTime *100 );

}

중력이 센지 100정도는 곱해줘야 어느정도 점프를 합니다.

Position을 직접이동해서인지 어색한 점프입니다.

--------------

2.RigidBody.Verocityd이용

--------------

private Rigidbody rb;

void Start () {

rb = GetComponent<Rigidbody>();

}

if (Input.GetKey(KeyCode.Space))

{

rb.velocity = new Vector3(0, 5, 0);

}

5정도 설정하니 꽤 괜찮은 점프입니다.

--------------

3.RigidBody.AddForce이용

--------------

private Rigidbody rb;

void Start () {

rb = GetComponent<Rigidbody>();

}

if (Input.GetKey(KeyCode.Space))

{

rb.AddForce = new Vector3(0, 100, 0);

}

100정도 설정하니 꽤 괜찮은 점프입니다.

--------------

실제작동해보니 버그가 발견되었습니다.

스페이스키를 계속 누르고 있으면 무한 점프가 가능합니다.

Plain에 닿았을 때만 점프가 작동하도록 해야할것 같습니다.

--------------

private bool isJumping=false; //점프유무기록

.

..

...

if (Input.GetKey(KeyCode.Space) && isJumping==false)

{

rb.AddForce = new Vector3(0, 100, 0);

isJumping=true;

}

--------------

여기까지 하면 단 1번만 점프가 가능합니다.

Plain에 닿았을때 isJumping=false로 변경이 필요합니다.

두가지 방법을 찾았습니다.

1.OnCollisionEnter이용

--------------

Plain:Inspector:Tag에서 태그를 설정합니다. Ground로 설정했습니다.

private void OnCollisionEnter(Collision collision)

{

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

{

isJumping = false;

}

}

--------------


https://docs.unity3d.com/ScriptReference/Collider.OnCollisionEnter.html


2.Physics.Linecast이용

--------------

Plain:Inspector:Layer에서 레이어를 설정합니다. Ground로 설정했습니다.

isJumping= Physics.Linecast(transform.position, transform.position - transform.up * 1.1f, LayerMask.GetMask("Ground") );

if (Input.GetKey(KeyCode.Space) && isJumping==false)

위에 추가했습니다.

점프처리후 isJumping=true; 는 없어도 되겠네요.

--------------


https://docs.unity3d.com/ScriptReference/Physics.Linecast.html



반응형