공부중

[Unity]modelViewer - 마우스 휠(Wheel) 로 카메라(Camera) 줌 - 구현(Field of View 값 변경) 본문

Project/modelViewer

[Unity]modelViewer - 마우스 휠(Wheel) 로 카메라(Camera) 줌 - 구현(Field of View 값 변경)

곤란 2018. 8. 20. 17:52
반응형

이전 글에서는 두가지 줌방식에 대해서 정리했고

여기서는 Field of View를 조절해서 줌하는 방식으로 하려고 한다.

 

최종 코드는 아래와 같다.

 

 

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

public class CameraController : MonoBehaviour {

    public float speed = 10.0f;
    public Transform cameraTarget;

    private Camera thisCamera;
    private Vector3 worldDefalutForward;

    private void Start()
    {
        thisCamera = GetComponent<Camera>();
        worldDefalutForward = transform.forward;
    }

    private void Update()
    {
        float scroll = Input.GetAxis("Mouse ScrollWheel") * speed;

        //최대 줌인
        if (thisCamera.fieldOfView <= 20.0f && scroll < 0)
        {
            thisCamera.fieldOfView = 20.0f;
        }
        // 최대 줌 아웃
        else if (thisCamera.fieldOfView >= 60.0f && scroll > 0)
        {
            thisCamera.fieldOfView = 60.0f;
        }
        // 줌인 아웃 하기.
        else
        {
            thisCamera.fieldOfView += scroll;
        }

        // 일정 구간 줌으로 들어가면 캐릭터를 바라보도록 한다.
        if (cameraTarget && thisCamera.fieldOfView <= 30.0f)
        {
            transform.rotation = Quaternion.Slerp(transform.rotation
                , Quaternion.LookRotation(cameraTarget.position - transform.position)
                , 0.15f);
        }
        // 일정 구간 밖에서는 원래의 카메라 방향으로 되돌아 가기.
        else
        {
            transform.rotation = Quaternion.Slerp(transform.rotation
                , Quaternion.LookRotation(worldDefalutForward)
                , 0.15f);
        }
     
    }

}

대충 60줄 안으로 끝난 간단한 코드다.

 

구현할 카메라는 다음과 같은 특징을 가진다.

- 카메라는 이동기능과 사용자 정의 회전이 없고 줌인 줌아웃만 한다.

- 이동기능이 없고 사용자 정의 회전이 없는 상태에서 줌인을 할 경우 캐릭터가 안보이는 문제가 발생

   ->특정 구간 지나가면 캐릭터를 쫒아서 보여주기로 하자!

 

이것을 생각하고 만들어 두었다.

코드를 하나씩 살펴보면..

 

    public float speed = 10.0f;
    public Transform cameraTarget;

두 개의 public 변수를 두었고 speed는 줌을 할 때 휠을 돌릴때마다 얼마나 줌을 돌릴지에 관한 변수이다.

(변수명좀 잘 지을껄 그랬다 -_-...)

 

cameraTarget을 public 으로 두어서 유니티 에디터에서 간단하게 타겟을 정할 수 있도록 하기 위해서 두었다.

 

    private Camera thisCamera;
    private Vector3 worldDefalutForward;

카메라가 한대 뿐이라 굳이... 이걸 만들까 고민했지만 나중에 카메라를 추가하게 된다는것을 염두해둬서 만들어 두었다.

그리고 Vector3 변수는 기본으로 바라봐야할 방향을 저장해두었다.

 

    private void Start()
    {
        thisCamera = GetComponent<Camera>();
        worldDefalutForward = transform.forward;
    }

Start 에서는 컴포넌트 받아오고 기본으로 바라보고 있는 정면 방향을 저장해 두었다.

 

    private void Update()
    {
        float scroll = Input.GetAxis("Mouse ScrollWheel") * speed;

        //최대 줌인
        if (thisCamera.fieldOfView <= 20.0f && scroll < 0)
        {
            thisCamera.fieldOfView = 20.0f;
        }
        // 최대 줌 아웃
        else if (thisCamera.fieldOfView >= 60.0f && scroll > 0)
        {
            thisCamera.fieldOfView = 60.0f;
        }
        // 줌인 아웃 하기.
        else
        {
            thisCamera.fieldOfView += scroll;
        }

        // 일정 구간 줌으로 들어가면 캐릭터를 바라보도록 한다.
        if (cameraTarget && thisCamera.fieldOfView <= 30.0f)
        {
            transform.rotation = Quaternion.Slerp(transform.rotation
                , Quaternion.LookRotation(cameraTarget.position - transform.position)
                , 0.15f);
        }
        // 일정 구간 밖에서는 원래의 카메라 방향으로 되돌아 가기.
        else
        {
            transform.rotation = Quaternion.Slerp(transform.rotation
                , Quaternion.LookRotation(worldDefalutForward)
                , 0.15f);
        }
     
    }

Update에서는 마우스 스크롤에 따른 축(?) 값과 얼마나 줌인 아웃을 할 양을 곱해서 scroll 변수에 저장하고

 

먼저 최대 줌인 줌아웃인지를 확인해서 밖으로 벗어나지 않게 하기 위한 분기문(if)을 두었다.

 

그리고 하단에서는 타겟이 null이 아니고 Field of View 값이 30 이하인경우에는 타겟을 바라보도록 분기문을 만들어 두었고

Quaternion.Slerp를 통해서 회전을 보간해 주었다.

 

Quaternion.Slerp는 이전 글(링크)에서 설명했으므로 생략...

 

결과는 위의 영상과 같당!

 

 

 

 

 

 

반응형