[Unity] Project. DayLight_2

Lingtea_luv·2025년 6월 21일

Project

목록 보기
28/38
post-thumbnail

Project. DayLight


기획 분들이 배려해주신 덕분에 플레이어 기능과 에셋이 빠르게 확정되어 작업을 진행할 수 있었다. 2일차 구현 예정 목록과 진행상황은 다음과 같다.

작업 완료 기능

  1. 시간의 흐름에 따른 빛 조절 + 이벤트 관리
  2. 카메라 시점(백뷰) 구현
  3. 플레이어 이동, 회전, 점프, 사다리 타기 기능
  4. 총, 총알 구현

작업 예정 기능

  1. 플레이어 이동 로직 - 계단 오르기, 달리기, 웅크리기, 파쿠르
  2. 플레이어 상호작용 - 문 열기, 루팅, 공격, 피격
  3. 플레이어 인벤토리, UI, 퀵슬롯
  4. 플레이어 파라미터 - 스탯, 속성, 수면
  5. 플레이어 모션 - 애니메이터 작업 + 상태 패턴

공유 코드

2일차에 작업한 내역으로는 사다리 타기 기능과 백뷰 시점 구현 PlayerController로 구현된 기능들을 묶는 것 밖에 없어서 이 중 사다리 타기 기능 구현한 것을 공유해보려고 한다.

PlayerClimb

작업할 때 신경 쓴 부분은 2가지였다.
1. 사다리를 타고 바닥에 닿을 경우 아래로 내려가는 것이 아닌 뒤로 가도록 구현
2. 입력이 없을 때 모션도 정지하여, 자연스러운 움직임을 구현

public class PlayerClimb : MonoBehaviour
{
	[Header("Drag&Drop")]
    [SerializeField] private Rigidbody _rigid;
    [SerializeField] private Animator _animator;
    
    [Header("Input Number")] 
    [SerializeField] private float _climbSpeed;
    
    // 사다리에 있는지를 나타내는 프로퍼티
    public bool IsOnClimbed
    {
        get;
        private set;
    }
    
    private void Awake()
    {
        Init();
    }

	// PlayerController에서 호출하는 public 메서드
    // isOnGround : 발이 땅에 닿았는지를 나타내는 변수
    public void ClimbUpdate(bool isOnGround)
    {
    	// 플레이어 앞쪽으로 Ray를 쏴서 사다리를 감지
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 0.6f))
        {
        	// 사다리가 감지될 경우
            if(hit.collider.CompareTag("Ladder"))
            {
            	// 사다리에 있도록 처리, 중력 무시, 애니메이터 Climb로 변경, Climb 함수 호출
                IsOnClimbed = true;
                _rigid.useGravity = false;
                _animator.SetBool("IsClimb", true);
                Climb(isOnGround);
            }
            // 사다리가 감지되지 않는 경우
            else
            {
            	// 사다리에 있지 않은 것으로 처리, 중력 적용, 애니메이터 Idle로 변경
                IsOnClimbed = false; 
                _rigid.useGravity = true;
                _animator.SetBool("IsClimb", false);
            }
        }
        // 아무것도 감지되는게 없는 경우
        else
        {
        	// 사다리에 있지 않은 것으로 처리, 중력 적용, 애니메이터 Idle로 변경
            IsOnClimbed = false; 
            _rigid.useGravity = true;
            _animator.SetBool("IsClimb", false);
        }
    }

	// 플레이어가 사다리에서 이동하는 로직을 담당하는 메서드
    private void Climb(bool isOnGround)
    {
    	// W키를 누르고 있는 경우
        if (Input.GetKey(KeyCode.W))
        {
        	// 플레이어가 사다리를 타고 위로 올라가도록 처리
            transform.position += Vector3.up * (_climbSpeed * Time.deltaTime);          
        }
        
        // 애니메이터의 속도를 입력값에 대입
        // 중간에 멈추는 경우(입력이 없는 경우) 모션도 멈추도록 연동시키기 위함(2)
        _animator.speed = Mathf.Abs(Input.GetAxis("Vertical"));
        
        // S키를 누르고 있는 경우
        if (Input.GetKey(KeyCode.S))
        {
        	// 땅에 닿았을 때
            if (isOnGround)
            {
            	// 플레이어가 아래가 아닌 뒤로 가도록 처리(1)
                transform.position -= transform.forward * (_climbSpeed * Time.deltaTime);
            }
            // 땅에 닿지 않았을 때
            else
            {
            	// 플레이어가 사다리를 타고 아래로 내려가도록 처리
                transform.position += Vector3.down * (_climbSpeed * Time.deltaTime);
            }
        }
    }
    
    private void Init()
    {
    	// 필드 초기화
        IsOnClimbed = false;
    }
}
profile
뚠뚠뚠뚠

0개의 댓글