상세 컨텐츠

본문 제목

1118 TIL - 플랫포머 2D 캐릭터 이동하기

스파르타 코딩캠프/'24 Today I Learned

by lucar 2024. 11. 18. 21:32

본문

또 새로운 프로젝트의 시작이다.

 

이번에는 2D플랫포머에서의 점프에 대해서 생각해보자

 

윗 블럭이 통과가 불가능한 블럭이 아니라면 점프를 통해 아래에서 위로 점프를 통해 통과할 수 있으며

밑 점프를 통해 블럭에서 아래로 이동이 가능하게 구현해야한다.

 

우선은 OnGround라는 함수를 만들어 이 캐릭터가 땅에(선택된 레이어에 포함된 게임오브젝트) 위에 있는지

확인해야한다.

private bool OnGround()
{
    //Todo : 캐릭터 스프라이트 정해지고 나서 레이 갯수를 늘려서 스프라이트 끝에서 끝까지
    RaycastHit2D hit = Physics2D.Raycast(new Vector2(Player.transform.position.x, Player.transform.position.y - 1f), Vector2.down, 0.5f, Platform);

    if (hit.collider?.gameObject.layer == 7)
    {
        return true;
    }
    else return false;
}

우선은 간단하게 만들었다.

 

그리고 점프를 구현해서 OnGround가 true라면 점프가 가능하게끔 했다.

private void Jump()
{
    if(OnGround() == true)
    {
        Player.Rigidbody.AddForce(Vector2.up * JumpPower, ForceMode2D.Impulse);
    }
}

다음은 점프 로직인데

private IEnumerator CoPlayerChecker()
{
    while (true)
    {
        if (Player.Rigidbody.velocity.y > 0)
        {
            Player.Collider.isTrigger = true;
        }
        else if (_downJump == true)
        {
            yield return wait;
            _downJump = false;
        }
        else if (Player.Rigidbody.velocity.y < 0 && _downJump == false)
        {
            Player.Collider.isTrigger = false;
        }
        yield return null;
    }
}

플레이어의 리지드바디 의 y값이 +라면 위로 상승 중

-라면 하강 중 일것이다.

 

isTrigger를 체크하면 콜라이더의 부딪히는 기능은 사라지고 해당 영역에 닿는 것만 반환하는 기능을 이용해서

플레이어를 투과 상태로 만들어주었다.

 

private void DownJump()
{
    if(OnGround() == true)
    {
        Player.Collider.isTrigger = true;
        _downJump = true;
    }
}

밑 점프도 마찬가지

 

실행해보자.

 

추후의 개선점으로는 가장 밑바닥에 있는 땅도 Platform 레이어라면 심연으로 빠지게되고

 

통과 불가능한 벽의 경우에도 velocity.y의 값이 양수인 경우에는 통과하게 된다.

 

가장 밑바닥의 땅 레이어를 검사하는 기능을 추가하고

통과 불가능한 벽 또한 레이어를 통해 OnCollision2D를 이용하여 is trigger를 해제해주는 방향으로 만들면 될 것 같다.

 

TTE

관련글 더보기