#2 Robot! Escape! - Input Handle & Follow Cam

w298·2022년 10월 17일
0

DEVLOG - Robot! Escape!

목록 보기
2/21
post-thumbnail

1. 플레이어 Input Handle

Input.GetKeyDown 이나 Input.GetAxis 를 이용한 Legecy 방법도 있지만, 이번엔 좀 다르게 하려고 한다.

Package Manager 에 있는 Input System 을 이용했다.

InputAction 을 Public 으로 선언하면 위처럼 Inspector 에 설정할 수 있게 뜬다.

  • movementAction - 플레이어 Movement (WASD)
  • aimAction - 조준 모드 (마우스 Right Button)
  • crouchAction - 앉기 (키보드 C 버튼: Toggle)
  • fireAction - 총기 발사 (마우스 Left Button)
public class RobotInputHandler : MonoBehaviour
{
    public InputAction movementAction;
    public InputAction fireAction;
    public InputAction aimAction;
    public InputAction crouchAction;

	private Vector2 movementAxis;
    public Vector2 movementVector = new(0, 0);
    public bool isCrouch = false;
    public bool isAim = false;
    public bool isMoving = false;
    public bool isFire = false;

    void Start()
    {
        movementAction.Enable();
        crouchAction.Enable();
        aimAction.Enable();

        crouchAction.performed += context =>
        {
            isCrouch = !isCrouch;
        };
    }

    void FixedUpdate()
    {
        movementAxis = movementAction.ReadValue<Vector2>();

        isAim = aimAction.ReadValue<float>() == 1;
        isFire = fireAction.ReadVale<float>() == 1;
        isMoving = movementAxis != Vector2.zero || movementVector.magnitude > 0.05f;

        movementVector = isMoving ? Vector2.Lerp(movementVector, movementAxis, Time.deltaTime * 7f) : new(0, 0);
        transform.position += new Vector3(movementVector.x, 0, movementVector.y) / (isCrouch || isAim ? 30 : 15);
    }
}

movementAxis 의 각 축의 값이 0 or 1이라서 움직임이 자연스럽지 않았다.
Vector2.Lerp 를 통해 보간한 값인 movementVector 를 활용해 position 을 컨트롤했다.

Aim 이나 Crouch 하면 속도가 느려져야 하므로 isCrouch || isAim ? 30 : 15 로 설정했다.
나중에 속도 증가 아이템이나 감소 아이템 사용 시 바뀌어야 하므로 수정할 예정


2. FollowCam 설정

Player 가 가지고 있는 컴포넌트이다.

  • Attached Cam - 부착할 카메라
  • Offset - 카메라와 플레이어 간의 Position Offset
public class PlayerFollowCam : MonoBehaviour
{
    public Camera attachedCam;
    public Vector3 offset;

    void FixedUpdate()
    {
        attachedCam.transform.position = Vector3.Lerp(attachedCam.transform.position, transform.position + offset, Time.deltaTime * 2);
    }
}

이것도 Vector3.Lerp 를 통해 보간했다.

profile
Game Developer & Web Developer

0개의 댓글