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