본문 바로가기
유니티 게임 개발

[유니티 강좌] 2D RPG 게임 만들기 - 7 / 점프

by 호일이 2020. 6. 7.

전 포스팅에서 이동관련 함수들을 알아봤는데요. 여러가지 방법이 사용될 수 있다는 것을 알았습니다.

마찬가지로 점프도 다양한 방법이 있겠지만 여기서는 Rigidbody.AddForce, Rigidbody.velocity를 사용해보겠습니다.

 

점프를 구현하기 위한 과정

1. 애니메이터 설정

2. 레이캐스트로 땅과 충돌 체크

3. 점프하기

 

애니메이터 설정

점프 애니메이션이 없다면 이 과정은 생략해도 됩니다.

Idle과 Jump, Run과 Jump에 Transition을 생성해줍니다.

 

파라미터에 Bool로 jumping을 선언해줍니다.

 

애니메이션 전환 조건을 밑의 그림에 따라 설정해줍니다.

 

 

 

 

애니메이터 설정은 끝났습니다.

Has Exit Time, Settings 부분은 조금 있다가 직접 점프를 눌러보면서 수정해도 늦지 않습니다.

 

참고용 Has Exit Time, Settings

저는 점프 관련된 Transition을 위와 같이 통일했습니다.

딱히 정답이 없으므로 원하는 수치만큼 조절하셔도 됩니다.

 

레이캐스트로 땅과 충돌 체크

jumping 변수를 false로 만들기 위해서는 캐릭터가 땅과 맞닿았는지 알 수 있어야 합니다.

OnColliderEnter로 구현해도 됩니다만, 개인적으로 반응이 살짝 느린 느낌이 들어서 레이캐스트를 사용했습니다.

더보기

보이지 않는 레이저를 쏴서 충돌체와 교차했는지 알 수 있게 합니다.

땅과 충돌을 체크할 때는 Raycast만으로는 부족하기 때문에 Boxcast를 사용해야 합니다.

Raycast

Boxcast

 

부착된콜라이더 col2D;
void Start() 
{
	col2D = GetComponent<부착된콜라이더>();
}

void Update() 
{
    RaycastHit2D raycastHit = Physics2D.BoxCast(col2D.bounds.center, col2D.bounds.size, 0f, Vector2.down, 0.02f, LayerMask.GetMask("Ground"));
    if (raycastHit.collider != null)
        animator.SetBool("jumping", false);
    else animator.SetBool("jumping", true);
}

Boxcast 형식

public static RaycastHit2D BoxCast(Vector2 origin, Vector2 size, float angle, Vector2 direction, float distance = Mathf.Infinity, int layerMask, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity )

origin

시작지점

size

박스의 크기

angle

박스의 각도

direction

박스의 방향

distance

박스의 최대 거리

layerMask

특정 레이어에서만 충돌확인

자세한 설명은 레퍼런스를 확인해주세요.

 

Unity - Scripting API: Physics2D.BoxCast

A BoxCast is conceptually like dragging a box through the Scene in a particular direction. Any object making contact with the box can be detected and reported. This function returns a RaycastHit2D object with a reference to the collider that is hit by the

docs.unity3d.com

Collider의 Bounds 레퍼런스입니다.

 

Unity - Scripting API: Bounds

An axis-aligned bounding box, or AABB for short, is a box aligned with coordinate axes and fully enclosing some object. Because the box is never rotated with respect to the axes, it can be defined by just its center and extents, or alternatively by min and

docs.unity3d.com

Layer Mask 설정

Ground를 적습니다.

땅 오브젝트의 Layer를 바꿉니다.

 

int layerMask에 레이어 번호 8을 쓰면 안됩니다.

1 << 8

혹은

1 << LayerMask.NameToLayer("Ground")

혹은

LayerMask.GetMask("Ground")

이렇게 사용해야 합니다.

 

여러 개의 레이어를 포함하는 방법

layerMask = LayerMask.GetMask("Ground") | LayerMask.GetMask("Enemy") | ... ; 

 

점프하기

충돌 체크까지 완료했다면 이제 점프하는 것만 남았습니다.

public float jumpPower = 40;
bool inputJump = false;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && !animator.GetBool("jumping"))
    {
        inputJump = true;
    }
}

void FixedUpdate()
{
    if(inputJump)
    {
        inputJump = false;
        rigid2D.AddForce(Vector2.up * jumpPower);
        //rigid2D.velocity = new Vector2(rigid2D.velocity.x, jumpPower);
    }
}

전 포스팅에서 설명했듯이 Update에서 키 입력을 받고 FixedUpdate에서 물리적 처리를 해야 합니다. AddForce와 velocity중 원하는 방식으로 점프를 하시면 됩니다.

 

추가로 점프 후 빨리 떨어뜨리기 위해 소드맨의 Rigidbody의 Gravity Scale을 1.7로 수정했습니다.

 

 

실행 화면

moveSpeed가 5이상일 때 벽에 붙어서 점프하면 끼인 듯 멈춰버립니다.

 

찰력 문제인데요.

다음 포스팅에서 이 문제를 해결해보겠습니다.

 

반응형

댓글