게임 개발 공부/Unity

New InputSystem 에서 마우스 스크롤(휠) 값으로 카메라 줌 만들기

CalebHong 2022. 2. 20. 15:23

기존 InputManager에서 InputSystem으로 갈아타면서 수정해주고 알아가야할게 많다.

마우스 스크롤 값 또한 구글링을 해도 잘 나와있지 않았다.

 

> 먼저 InputActions에서 마우스 휠값을 받을 Actions을 생성해야 한다.

> Action Type은 Pass Through로, Control Type은 Axis로 설정 한다.

> 그리고 Actions 오른쪽의 +를 눌러 Add Binding을 눌러 바인드를 생성한다.

> Path에서 Mouse를 누르고 아래쪽에 Scroll의 Y값을 받도록 설정한다.

 

Action은 설정이 되었고, 스크립트를 보기전에 먼저 InputActions의 클래스를 생성해야 한다.

아래와 같이 Generate C# Class를 체크하고 Apply를 눌러 클래스를 생성하자(클래스 네임은 사진과 다를 수 있음).

이제 스크립트로 가서 생성한 클래스를 사용할 수 있다.

public class Player : MonoBehaviour
{
    private PlayerInputAction _playerInputAction; // 생성한 클래스(클래스 이름은 다를 수있음)
    
    private float scrollY; // 스크롤 값을 저장할 float 변수
        
    private void OnEnable()
    {
        _playerInputAction = new PlayerInputAction();
        _playerInputAction.Enable();
        // 이벤트를 이용하여 스크롤이 발생했을 시 스크롤의 값을 변수에 저장한다.
        // 스크롤 값이 120과 -120만 받아오기 때문에 0.02f를 곱하여 낮출 수 있다.
        _playerInputAction.GamePlay.MouseScrollY.performed += x => scrollY = x.ReadValue<float>() * 0.02f * -1;
		// 카메라의 FOV값을 불러옴
        normalCamera.m_Lens.FieldOfView = PlayerPrefs.GetFloat("ZoomAmount", 0);
    }

    private void OnDisable()
    {
        _playerInputAction.Disable();
    }
    
    private void OnApplicationQuit()
    {
    	// 카메라의 FOV값을 저장
        PlayerPrefs.SetFloat("ZoomAmount", normalCamera.m_Lens.FieldOfView);
    }
    
    private void FixedUpdate()
    {
    	// 스크롤을 내릴 때, FOV가 15밑으로 더 이상 내려가지 않도록 제한
        if (scrollY < 0 && normalCamera.m_Lens.FieldOfView <= 15)
        {
            normalCamera.m_Lens.FieldOfView = 15;
        }
    	// 스크롤을 올릴 때, FOV가 60 이상으로 올라가지 않도록 제한
        else if (scrollY > 0 && normalCamera.m_Lens.FieldOfView >= 60)
        {
            normalCamera.m_Lens.FieldOfView = 60;
        }
        // 스크롤 값을 통해 FOV 값을 바꿈
        else
        {
            normalCamera.m_Lens.FieldOfView += scrollY;
        }
    }
}

이렇게 간단한데 사실 구글링과 유튜브를 엄청 찾아봐서 알아냈다는 거..ㅠㅠ

performed를 사용하여 이벤트를 설정해주는 것이 중요하다!

_playerInputAction.GamePlay.MouseScrollY.performed += x => scrollY = x.ReadValue<float>() * 0.02f * -1;

한줄 코드 대신 더 넣고 싶으면 아래와 같이 하면 된다.

_playerInputAction.GamePlay.MouseScrollY.performed += x => 
{
	scrollY = x.ReadValue<float>() * 0.02f * -1;
    ...
};

 

적용한 게임 플레이 화면