지난 닉네임 같은 크기 글씨에 이어 이번에는 마우스 휠을 돌려
카메라 줌 인/아웃(Zoom In/Out)을 제어하는 부분을 다뤄보도록 하겠습니다.
코드를 짜다 보니 사실 너무 단순해서 좀 더 기능을 넣을까 고민해보다가 그냥 바로 공개하기로 했습니다 :)
우선 완성본 코드 보시죠!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamController : MonoBehaviour
{
public GameObject player; // 바라볼 플레이어 오브젝트입니다.
public float xmove = 0; // X축 누적 이동량
public float ymove = 0; // Y축 누적 이동량
public float distance = 3;
///public float rotationSpeed = 0.01f;
public float SmoothTime = 0.2f;
private Vector3 velocity = Vector3.zero;
private int toggleView=3; // 1=1인칭, 3=3인칭
private float wheelspeed=10.0f;
// Update is called once per frame
void Update()
{
// 마우스 우클릭 중에만 카메라 무빙 적용
if (Input.GetMouseButton(1))
{
xmove += Input.GetAxis("Mouse X"); // 마우스의 좌우 이동량을 xmove 에 누적합니다.
ymove -= Input.GetAxis("Mouse Y"); // 마우스의 상하 이동량을 ymove 에 누적합니다.
}
transform.rotation = Quaternion.Euler(ymove, xmove, 0); // 이동량에 따라 카메라의 바라보는 방향을 조정합니다.
if (Input.GetMouseButtonDown(2))
toggleView = 4 - toggleView;
if (toggleView == 3)
{
distance -= Input.GetAxis("Mouse ScrollWheel") * wheelspeed;
if (distance < 1.0f) distance = 1.0f;
if (distance > 100.0f) distance = 100.0f;
}
if (toggleView == 1)
{
Vector3 reverseDistance = new Vector3(0.0f, 0.4f, 0.2f); // 카메라가 바라보는 앞방향은 Z 축입니다. 이동량에 따른 Z 축방향의 벡터를 구합니다.
transform.position = player.transform.position + transform.rotation * reverseDistance; // 플레이어의 위치에서 카메라가 바라보는 방향에 벡터값을 적용한 상대 좌표를 차감합니다.
}
else if (toggleView == 3)
{
Vector3 reverseDistance = new Vector3(0.0f, 0.0f, distance); // 카메라가 바라보는 앞방향은 Z 축입니다. 이동량에 따른 Z 축방향의 벡터를 구합니다.
transform.position = Vector3.SmoothDamp(
transform.position,
player.transform.position - transform.rotation * reverseDistance,
ref velocity,
SmoothTime);
}
}
}
플레이중 마우스 휠을 굴리면 카메라가 앞으로 줌인(Zoom In)을 하거나, 뒤로 줌아웃(Zoom Out)할 수 있습니다.
줌인, 줌아웃 기능은 3인칭 시점 보기에서만 작동합니다.
줌의 거리는 가장 가까이는 근접 1미터, 최장 거리는 100미터까지 가능합니다.
사실 오늘 추가된 코드는 아주 단순합니다.
마우스 휠의 굴림 이동량을 판단해서 줌인, 아웃을 적용해주는 것인데요.
우선 마우스 휠을 돌렸을 때의 이동량을 판단하는 함수는 아래와 같습니다.
Input.GetAxis("Mouse ScrollWheel")
마우스 이동과 비슷한 원리로 Update() 함수가 호출될 때마다 이동한 량을 리턴해 줍니다.
플레이어와 카메라의 거리를 나타내는 distance 변수에서 이 값을 빼줍니다. 그것으로 카메라 거리가 조정되는데요.
distance -= Input.GetAxis("Mouse ScrollWheel") * wheelspeed;
3인칭 시점에서 distance 변수로 이미 카메라를 조정하는 코드가 작동하고 있기 때문입니다.
이 코드는 이미 작동되고 있었지요.
Vector3 reverseDistance = new Vector3(0.0f, 0.0f, distance); // 카메라가 바라보는 앞방향은 Z 축입니다. 이동량에 따른 Z 축방향의 벡터를 구합니다.
transform.position = Vector3.SmoothDamp(
transform.position,
player.transform.position - transform.rotation * reverseDistance,
ref velocity,
SmoothTime);
단, distance 값을 조정하면서 거리가 너무 가깝거나 멀리 떨어지지 않게
조정해주는 코드가 추가되고,
if (distance < 1.0f) distance = 1.0f;
if (distance > 100.0f) distance = 100.0f;
3인칭 시점 모드에서만 작동하도록 제약을 걸어주는 것이지요.
if (toggleView == 3)
{
distance -= Input.GetAxis("Mouse ScrollWheel") * wheelspeed;
if (distance < 1.0f) distance = 1.0f;
if (distance > 100.0f) distance = 100.0f;
}
이 것으로 끝! 입니다. 간단하게 마무리되었군요.
필요하신 분에게 도움 되셨나 모르겠습니다.
오늘도 여기까지 읽어주신 분들께 감사드립니다 :)
예수 그리스도께서 부활하셨습니다!
부활절 주간은 좀 지나긴 했지만요 :)
믿는 이들에게 최대의 기쁜 소식은 바로 그리스도의 부활입니다.
내가 받은 것을 먼저 너희에게 전하였노니
이는 성경대로 그리스도께서
우리 죄를 위하여 죽으시고 장사 지낸 바 되었다가
성경대로 사흘 만에 다시 살아나사
-고린도전서 15장 3-4절 말씀-
다음 챕터. 유니티 3D - 아셋 스토어 캐릭터 사용하기
'유니티3D' 카테고리의 다른 글
유니티 3D - 아셋 스토어 캐릭터 스크립트 수정 - 스카이 워킹! (1) | 2021.04.26 |
---|---|
유니티 3D - 아셋 스토어 캐릭터 사용하기 (0) | 2021.04.24 |
유니티3D 플레이어 같은크기 이름표시 (0) | 2021.04.11 |
유니티3D 플레이어 이름표시 (1) | 2021.04.10 |
유니티3D 플레이어 조작 #6. 1/3인칭 시점 전환 (0) | 2021.04.09 |