반응형
참고
→ 시네머신 튜토리얼 링크 (시네머신을 이용하여 카메라 간편하게 조작하기)
- 멀티 터치 드래그를 이용하여 카메라 줌 인 / 아웃
카메라를 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:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
프로퍼티로 readonly 변수 만들기 (get; private set;) (0) | 2022.05.17 |
---|---|
유니티 - 오브젝트를 선택된 상태로 만들기 : (4) 오브젝트 하나만 선택하기 (0) | 2022.05.17 |
유니티 Plane, 평면의 길이 (0) | 2022.05.14 |
유니티 - 간단한 투명 Material 만들기 (1) | 2022.05.14 |
유니티 - 드래그로 평면 위의 오브젝트 움직이기 (Drag and Move on the Plane) (0) | 2022.05.14 |
댓글