내일배움캠프/Unity

Unity 3D 사다리 구현

danpat77 2025. 3. 10. 20:42

사다리 시스템 작동 방식

  1. 플레이어가 사다리 근처로 가면 OnTriggerEnter()가 실행되어 사다리 사용 상태로 변경
  2. 플레이어가 사다리를 사용중에는 오르고 내려갈 수 있음
  3. 플레이어가 사다리에서 벗어나면 OnTriggerExit()가 실행되어 다시 중력 활성화

코드 구현 - 사다리 감지 및 상태 변경(Landder.cs)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Landder : MonoBehaviour
{
    bool useLandder = false; // 사다리 사용 상태

    private void Update()
    {
        if (useLandder)
        {
            CharacterManager.Instance.Player.controller.UseLandder();
        }
    }

    private void OnTriggerEnter(Collider other)
    {
    	// 사다리 사용 상태 가능으로 변경
        useLandder = true;
        CharacterManager.Instance.Player.controller.isUseObject = true;
    }

    private void OnTriggerExit(Collider other)
    {
    	// 사다리 사용 상태 불가능으로 변경
        useLandder = false;
        CharacterManager.Instance.Player.controller.isUseObject = false;
        CharacterManager.Instance.Player.controller.UseGrabity(); // 중력 활성화
    }
}

코드 구현 -  플레이어 사다리 이동 기능 (PlayerController.cs)

// 이동 로직
public void OnMoveInput(InputAction.CallbackContext context)
{
    if (context.phase == InputActionPhase.Performed) // 키보드 입력을 받고 움직였을 때
    {
        curMovementInput = context.ReadValue<Vector2>();
    }
    else if (context.phase == InputActionPhase.Canceled) // 키보드 입력이 끝났을 때
    {
        curMovementInput = Vector2.zero;
    }
}
// 사다리 로직
public void UseLandder()
{
    _rigidbody.useGravity = false; // 중력 제거

    if (curMovementInput.y > 0) // 위로 이동
    {
        _rigidbody.velocity = new Vector3(0, moveSpeed * 0.5f, 0);
    }
    else if (curMovementInput.y < 0) // 아래로 이동
    {
        _rigidbody.velocity = new Vector3(0, -moveSpeed * 0.5f, 0);
    }
    else // 멈춰있을 때
    {
        _rigidbody.velocity = Vector3.zero;
    }
}

실행 결과

 

플레이어가 사다리에 붙으면 사다리를 중력을 false로 변경하여 사다리를 오르고 내릴 수 있다.

또한 사다리에 벗어나면 중력이 true로 변경되어 다시 원래대로 이동이 가능하다.