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 캐릭터의 움직임이 더욱 다양하고 역동적이라는 것을 알게 될 것입니다.