본문 바로가기
TIL

01.11 (TIL-Unity)

by 오랑이귀엽다 2024. 1. 11.

앉기기능 추가

앉기 기능을 추가하는 이유는 방탈출게임을 제작하면서 플레이어가 앉아야지만 볼수있는 오브젝트나 힌트들을 위해 추가를 결정했습니다.

 

내가 생각한 기능구현을 위한 방법

  1. 앉기 기능 활성화: 플레이어가 앉기 버튼을 누를 때마다 앉아 있는 상태와 서 있던 상태를 토글합니다.
  2. 이동 속도 조절: 플레이어가 앉아 있을 때 이동 속도를 감소시킵니다.
  3. Collider 크기 조절: 플레이어가 앉아 있을 때 Collider의 높이를 줄입니다.
  4. 카메라 위치 조절: 플레이어가 앉아 있을 때 카메라의 높이를 줄입니다.
  5. 인스펙터에서 조절 가능한 변수 추가: 감소하는 수치들을 인스펙터에서 조절할 수 있도록 public 변수로 선언합니다.

변수 선언 및 초기화

더보기

[Header("Sit")]
public float sitSpeed; // 앉았을 때 이동 속도 감소 비율
public float sitColliderHeight; // 앉았을 때 Collider 높이 감소 비율
public float sitCameraYPos; // 앉았을 때 카메라 Y 위치 감소 비율

private bool isSitting = false; // 플레이어가 앉아있는지 여부
private BoxCollider playerCollider; // 플레이어의 박스 콜라이더
private float originalColliderHeight; // 원래 콜라이더 높이
private float originalCameraYPos; // 원래 카메라 Y 위치
private float originalMoveSpeed; // 원래 이동 속도

 

sitSpeed, sitColliderHeight, sitCameraYPos는 Unity 인스펙터를 통해 직접 설정할 수 있는 값이다.

각각 앉았을 때 적용할 이동 속도, Collider의 높이, 카메라의 Y 위치를 나타낸다.

Awake 함수

더보기

private void Awake()
{
    playerCollider = GetComponent<BoxCollider>(); // 플레이어의 박스 콜라이더 컴포넌트를 가져옴
    originalColliderHeight = playerCollider.size.y; // 초기 콜라이더 높이 저장
    originalCameraYPos = cameraContainer.localPosition.y; // 초기 카메라 Y 위치 저장
    originalMoveSpeed = moveSpeed; // 초기 이동 속도 저장
}

 

Awake 함수에서는 시작 시 플레이어의 기본 콜라이더 높이, 카메라 위치, 이동 속도를 저장

나중에 플레이어가 다시 서 있을 때 원래 상태로 복원해야하기 때문에 추가

앉기 동작 처리

더보기

public void OnSitInput(InputAction.CallbackContext context)
{
    if (context.phase == InputActionPhase.Performed)
    {
        ToggleSit(); // 앉기 동작 토글
    }
}

private void ToggleSit()
{
    isSitting = !isSitting; // 앉는 상태 토글

    if (isSitting)
        SitDown(); // 앉는 동작 실행
    else
        StandUp(); // 일어나는 동작 실행
}

private void SitDown()
{
    moveSpeed = originalMoveSpeed * sitSpeed; // 이동 속도 조절
    playerCollider.size = new Vector3(playerCollider.size.x, originalColliderHeight * sitColliderHeight, playerCollider.size.z); // 콜라이더 높이 조절
    cameraContainer.localPosition = new Vector3(cameraContainer.localPosition.x, originalCameraYPos * sitCameraYPos, cameraContainer.localPosition.z); // 카메라 위치 조절
}

private void StandUp()
{
    moveSpeed = originalMoveSpeed; // 이동 속도 복원
    playerCollider.size = new Vector3(playerCollider.size.x, originalColliderHeight, playerCollider.size.z); // 콜라이더 높이 복원
    cameraContainer.localPosition = new Vector3(cameraContainer.localPosition.x, originalCameraYPos, cameraContainer.localPosition.z); // 카메라 위치 복원
}

 

OnSitInput 함수는 Input System을 통해 앉기 동작의 입력을 받는다.

ToggleSit 함수는 플레이어의 앉는 상태를 토글한다.

( 플레이어가 앉아 있지 않으면 SitDown을 호출해 앉게 하고, 이미 앉아 있으면 StandUp을 호출해 일으킨다.)

SitDown 함수에서는 이동 속도를 줄이고, 콜라이더의 높이와 카메라 위치를 조절한다.

( sitSpeed, sitColliderHeight, sitCameraYPos 변수들이 사용)

StandUp 함수는 플레이어의 상태를 원래대로 복원한다.

( 이동 속도, 콜라이더의 높이, 카메라 위치를 초기 값으로 되돌린다.)

'TIL' 카테고리의 다른 글

01.15 (TIL-Unity)  (0) 2024.01.15
01.12 (TIL-Unity)  (0) 2024.01.12
01.10 (TIL-Unity)  (0) 2024.01.10
01.09 (TIL-Unity)  (1) 2024.01.09
01.08 (TIL-Unity)  (0) 2024.01.08