Input.GetKeyDown
이나 Input.GetAxis
를 이용한 Legecy 방법도 있지만, 이번엔 좀 다르게 하려고 한다.
Package Manager 에 있는 Input System
을 이용했다.
InputAction
을 Public 으로 선언하면 위처럼 Inspector 에 설정할 수 있게 뜬다.
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
로 설정했다.
나중에 속도 증가 아이템이나 감소 아이템 사용 시 바뀌어야 하므로 수정할 예정
Player 가 가지고 있는 컴포넌트이다.
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
를 통해 보간했다.