상세 컨텐츠

본문 제목

1119 TIL - 플랫포머 플레이어 이동 2

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

by lucar 2024. 11. 19. 21:24

본문

OnCollision을 이용해 구현해보려 하였으나

 

코루틴이 매 프레임마다 점검하고

OnCollisionStay2D도 매 프레임마다 점검하다 보니 대실패!

 

레이를 추가해서 작성했다.

 

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

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

private bool OnPlatform()
{
    RaycastHit2D hit = Physics2D.Raycast(new Vector2(Player.transform.position.x, Player.transform.position.y - 1f), Vector2.down, 0.3f);

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

private bool IsPassable()
{
    RaycastHit2D[] detector = 
        { 
            Physics2D.Raycast(new Vector2(Player.transform.position.x, Player.transform.position.y - 0.8f), Vector2.up, 1.4f, Platform),
            Physics2D.Raycast(new Vector2(Player.transform.position.x - 0.5f, Player.transform.position.y), Vector2.right, 1f, Platform)
        };
    bool passable = false;
    for (int i = 0; i < detector.Length; i++)
    {
        if (detector[i].collider?.gameObject.layer == 7)
        {
            passable = true;
        }
    }
    return passable;
}

 

디버그 레이로 확인해보자.

private void Update()
{
    Debug.DrawRay(new Vector2(Player.transform.position.x, Player.transform.position.y - 1), Vector2.up * 1.5f, Color.red);
    Debug.DrawRay(new Vector2(Player.transform.position.x - 0.5f, Player.transform.position.y), Vector2.right, Color.red);
    Debug.DrawRay(new Vector2(Player.transform.position.x, Player.transform.position.y - 0.8f), Vector2.up * 1.4f, Color.red, 1f);
}

대충 이 정도 범위(가로선 너비, 세로선 잔상 높이)

옆의 잔상은 float값을 입력했기 때문에 존재한다.

 

이 범위 안에 레이어를 검출하여 플랫폼 레이어라면 투과가 가능하고 아니라면 투과가 불가능하게 설정했다.

private IEnumerator CoPlayerChecker()
{
    while (true)
    {
        if (Player.Rigidbody.velocity.y > 0 && IsPassable() == true)
        {
            _collider.isTrigger = true;
        }
        else if (_downJump == true)
        {
            _animator.SetBool("Falling", true);
            yield return wait;
            _downJump = false;
        }
        else if (Player.Rigidbody.velocity.y < -1 && _downJump == false)
        {
            _animator.SetBool("Falling", true);
            _collider.isTrigger = false;
        }
        else
        {
            _animator.SetBool("Falling", false);
        }
        yield return null;
    }
}

땅은 디폴트 레이어고

 

플랫폼은 플랫폼 레이어로 준비해줬다.

 

실행해보자.

잘 실행되는 것 같아 보인다.

 

추후 개선점으로는 벽에 비비면 바닥에 안떨어지는 점을 수정하면 좋을 것 같다.

아니면 이대로 벽에 비비고 있는 상태를 추가해서 위나 아래 방향키를 통해 벽을 타게끔 하는것도 좋을 것 같다.

 

TTE

관련글 더보기