본문 바로가기
개발/Unity

유니티 - 마우스 스크롤로 카메라 줌 인 / 아웃 (Camera Zoom in / out with a Mouse Scroll)

by 피로물든딸기 2022. 5. 14.
반응형

Unity 전체 링크

 

참고

 시네머신 튜토리얼 링크 (시네머신을 이용하여 카메라 간편하게 조작하기)

- 멀티 터치 드래그를 이용하여 카메라 줌 인 / 아웃

 

카메라를 Rotate하고 Zoom in / out도 할 수 있도록 해보자.

(시네머신 FreeLook Camera Zoom in / out)

 

카메라를 줌 인/아웃 하는 방법은 크게 두 가지가 있다.

 

- fieldOfView

- 카메라가 향한 방향으로 앞/뒤 이동


fieldOfView

 

Field Of View는 카메라의 시야각이다.

Input.GetAxis("Mouse ScrollWheel")을 이용해 Camera의 fieildOfView를 변경하면 된다.

    public float scrollSpeed = 2000.0f;

    void Update()
    {
    	if(...)
        else
        {
            float scroollWheel = Input.GetAxis("Mouse ScrollWheel");
            
            Camera.main.fieldOfView += scroollWheel * Time.deltaTime * scrollSpeed;
        }
    }

 

위의 코드를 RotateAround.cs에 추가하자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateAround : MonoBehaviour
{
    public GameObject stage;

    private float xRotateMove, yRotateMove;

    public float rotateSpeed = 500.0f;

    public float scrollSpeed = 2000.0f;

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            xRotateMove = Input.GetAxis("Mouse X") * Time.deltaTime * rotateSpeed;
            yRotateMove = Input.GetAxis("Mouse Y") * Time.deltaTime * rotateSpeed;

            Vector3 stagePosition = stage.transform.position;

            transform.RotateAround(stagePosition, Vector3.right, -yRotateMove);
            transform.RotateAround(stagePosition, Vector3.up, xRotateMove);

            transform.LookAt(stagePosition);
        }
        else
        {
            float scroollWheel = Input.GetAxis("Mouse ScrollWheel");
            
            Camera.main.fieldOfView += scroollWheel * Time.deltaTime * scrollSpeed;
        }
    }
}

 

실제 Scene에서 카메라의 Filed of View를 움직이면 시야각이 넓어지고 있다.

하지만 시야각이 커질 뿐, 카메라가 실제로 오브젝트에 다가가거나 멀어진 것이 아니기 때문에 

아래와 같은 기현상이 일어난다.


카메라가 향한 방향으로 앞/뒤 이동

 

원하는 Zoom in/out은 카메라를 실제로 이동시키는 것이다.

카메라의 방향을 구한 후, 카메라의 위치를 수정하면 된다.

    float scroollWheel = Input.GetAxis("Mouse ScrollWheel");

    Vector3 cameraDirection = this.transform.localRotation * Vector3.forward;

    this.transform.position += cameraDirection * Time.deltaTime * scroollWheel * scrollSpeed;

 

코드를 적용하면 실제로 카메라와 오브젝트의 거리가 변경되는 것을 알 수 있다.

 

전체 코드는 아래와 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateAround : MonoBehaviour
{
    public GameObject stage;

    private float xRotateMove, yRotateMove;

    public float rotateSpeed = 500.0f;

    public float scrollSpeed = 2000.0f;

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            xRotateMove = Input.GetAxis("Mouse X") * Time.deltaTime * rotateSpeed;
            yRotateMove = Input.GetAxis("Mouse Y") * Time.deltaTime * rotateSpeed;

            Vector3 stagePosition = stage.transform.position;

            transform.RotateAround(stagePosition, Vector3.right, -yRotateMove);
            transform.RotateAround(stagePosition, Vector3.up, xRotateMove);

            transform.LookAt(stagePosition);
        }
        else
        {
            float scroollWheel = Input.GetAxis("Mouse ScrollWheel");

            Vector3 cameraDirection = this.transform.localRotation * Vector3.forward;

            this.transform.position += cameraDirection * Time.deltaTime * scroollWheel * scrollSpeed;
        }
    }
}

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글