Unity용 플레이어 3D 및 2D 벽 점프 튜토리얼

플랫폼 게임과 액션 게임에서 널리 사용되는 메커니즘인 벽 점프를 사용하면 플레이어가 벽에서 뛰어내릴 수 있어 탐색에 복잡성과 다양성이 추가됩니다. 이 튜토리얼은 제공된 FPS 컨트롤러에 벽 점프를 통합하는 것을 목표로 합니다. 결국 플레이어 캐릭터는 2D와 3D 설정 모두에서 벽 점프를 실행할 수 있게 됩니다.

'SC_FPSController' 스크립트를 사용하여 3D용 벽 점프 구현

Unity FPS 컨트롤러 튜토리얼에서 제공된 기본 코드를 시작으로 벽 점프 메커니즘을 소개하겠습니다.

1단계: 벽 감지 설정

  • 벽에서 뛰어내릴 수 있는 개체에 대해 "Wall"라는 이름의 Unity에 새 레이어를 추가합니다.
  • Unity FPS 컨트롤러 튜토리얼에서 얻을 수 있는 'SC_FPSController' 클래스를 다음 변수로 업데이트합니다.
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

2단계: 벽 감지

  • 벽을 감지하려면 'Update()' 메서드 내에 다음 로직을 통합하세요.
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.right, out hit, 1f, wallLayer) || Physics.Raycast(transform.position, -transform.right, out hit, 1f, wallLayer))
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

위 코드의 레이캐스트는 플레이어의 왼쪽과 오른쪽에 있는 벽을 감지합니다.

3단계: 3D용 벽 점프 구현

  • 'Update()' 메서드 내에서 지상 점프 로직 뒤에 다음을 삽입합니다.
else if (Input.GetButton("Jump") && canMove && isTouchingWall)
{
    moveDirection.y = wallJumpForce;

    // This adds a bit of horizontal force opposite the wall for a more dynamic jump
    if (Physics.Raycast(transform.position, transform.right, 1f, wallLayer))
    {
        moveDirection += -transform.right * wallJumpForce / 2.5f; // Adjust the divisor for stronger/weaker push.
    }
    else if (Physics.Raycast(transform.position, -transform.right, 1f, wallLayer))
    {
        moveDirection += transform.right * wallJumpForce / 2.5f;
    }
}

위 코드의 이 로직은 플레이어가 점프 버튼을 누르고 있는지, 이동할 수 있는지, 벽에 닿고 있는지 확인합니다. 그렇다면 벽에서 수직 방향의 힘과 약간의 수평 방향 힘을 전달합니다.

'CharacterController2D' 스크립트를 사용하여 2D용 벽 점프 구현

2D Character Controller for Unity 튜토리얼에서 제공된 기본 코드를 시작으로 벽 점프 메커니즘을 소개합니다.

1단계: 벽 감지 설정

  • 벽에서 뛰어내릴 수 있는 개체에 대해 "Wall"라는 이름의 Unity에 새 레이어를 추가합니다.
  • 2D Character Controller for Unity 튜토리얼에서 얻을 수 있는 'CharacterController2D' 클래스를 다음 변수로 업데이트합니다.:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

2단계: 2D에서 벽 감지

  • 벽을 감지하려면 'Update()' 메서드 내에 다음 로직을 통합하세요.
RaycastHit2D wallHitLeft = Physics2D.Raycast(transform.position, Vector2.left, 1f, wallLayer);
RaycastHit2D wallHitRight = Physics2D.Raycast(transform.position, Vector2.right, 1f, wallLayer);

if (wallHitLeft.collider != null || wallHitRight.collider != null)
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

3단계: 2D용 벽 점프 구현

  • 'Update()' 메서드 내에서 지상 점프 로직 뒤에 다음을 삽입합니다.
if (Input.GetKeyDown(KeyCode.W) && isTouchingWall && !isGrounded)
{
    r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight);
    if (wallHitLeft.collider != null)
    {
        r2d.AddForce(new Vector2(wallJumpForce, 0)); // Push to the right when wall is on the left
    }
    else if (wallHitRight.collider != null)
    {
        r2d.AddForce(new Vector2(-wallJumpForce, 0)); // Push to the left when wall is on the right
    }
}

해결된 질문:

  1. 캐릭터가 Unity에서 벽을 어떻게 감지할 수 있나요?: 캐릭터는 레이캐스팅을 사용하여 벽을 감지할 수 있습니다. 플레이어로부터 보이지 않는 광선을 원하는 방향으로 쏘면 벽과 같은 물체가 이 광선과 교차하는지 확인할 수 있습니다.
  2. Unity에서 2D와 3D 벽 점프 구현의 차이점은 무엇입니까?: Unity에서 2D 물리학은 'Physics2D' 방법을 사용합니다. (예: 'Physics2D.Raycast()'), 3D 물리학은 'Physics' 방법(예: 'Physics.Raycast()' ). 논리는 상대적으로 유사하지만 방법과 방향(2D의 경우 Vector2, 3D의 경우 Vector3)은 다양합니다.

결론

이 추가 기능을 사용하면 2D 공간의 캐릭터가 벽에서 뛰어 내릴 수 있습니다. 원활한 게임 플레이를 보장하려면 힘 값을 실험해야 할 수도 있습니다. 이러한 단계를 통합함으로써 플레이어는 벽이 있는 환경에서 2D 캐릭터의 움직임이 더욱 다양하고 역동적이라는 것을 알게 될 것입니다.

추천 기사
Unity용 RTS 및 MOBA 플레이어 컨트롤러
Unity에서 파쿠르 시스템 구현
Unity용 손전등 튜토리얼
Unity용 리지드바디 기반 유성 플레이어 컨트롤러
Unity용 하향식 플레이어 컨트롤러 튜토리얼
Unity의 2D 플랫폼 게임 캐릭터 컨트롤러에 이중 점프 지원 추가
Unity의 FPS 플레이어에 크라우칭 추가하기