벌써 4달이 다 되어간다니, 세월 참 빠르다. 이번주는 시네머신 카메라 사용법을 공부했다.
Cinemachine
준비
Window - Package Manager - Packages: Unity Registry에서 Cinemachine 검색해 Install - Sample scene도 받아줄 것.
Sample scene 중 2D Confined Target Group 활용함
Cinemachine Brain
Show Debug Text : 체크되어 있으면 Game 창에서 Main 카메라가 현재 어떤 virtual camera를 사용하고 있는지 보여주므로 판별하기 쉬움.
World Up Override : Top view에 유용
Update Method : 카메라 업데이트할 방법 (fixed: 물리적인 시간 따라감, smart 를 주로 사용)
Default Blends : 서로 다른 virtual 카메라가 섞이는 방식
- 옆에 적는 숫자가 커지면 느리게 바뀜.
- Custom: 커브를 조정해 원하는 대로 설정 가능
Cinemachine Virtual Camera
- Game Window Guides : 켜져 있어야 추적 대상, DeadZone, SafeZone 등의 영역 볼 수 있음.
- Save During Play : Play 도중 Cinemachine 카메라의 설정값을 변경했을 때 그 변경 값을 저장할 것인지 여부.
- Follow : 추적 대상. Transform이 들어감.
Lens
- Ortho Size 숫자 작아질수록 확대
- Near Clip Plane 카메라 기준 얼마나 가까운 범위까지 촬영할 것인지
- Far Clip Plane 카메라 기준 얼마나 먼 범위까지 촬영할 것인지
- Dutch 촬영 기법
- Advanced - Mode Override
- 메인 카메라가 현재 virtual 카메라 위치로 왔을 때 원래 메인 카메라의 설정을 무시하고 여기에서 설정된 카메라 모드로 보여줌.
- Perspective 설정하면 메인 카메라가 Orthographic (2D)임에도 Perspective 카메라로 전환되기 때문에 원근감 있게 보임.
Body
2D는 Framing Transposer로 설정
- Lookahead
- 진행 방향으로 추적 지점을 옮기게끔 함. 그래서 움직이는 방향 쪽의 시야가 더 확보되도록.
- Loopahead Smooth 숫자를 키워줘야 부드럽게 움직임.
- Loopahead Ignore Y: 체크할 경우 Y 방향으로는 추적 지점 옮기지 않음.
- Damping : 카메라가 대상 따라갈 때의 최대 offset. 숫자가 커질수록 카메라가 대상과 거리를 두고 쫓아감. 단, 추적 대상이 빨간 박스(Soft Zone)를 벗어나지 않게끔 추적함.
- Screen X, Y 추적 대상을 Screen에서 어디에 위치하게 할 것인지 설정 가능. 캐릭터가 기본적으로 화면 왼쪽에 있어야 한다면 (ex. 러너 게임) Screen X를 0.5보다 작게 만듦.
- Dead Zone : 데드 존 안에 추적 대상이 있으면 카메라가 추적하거나 반응하지 않음.
- 데드 존을 벗어난 경우 데드존 라인에 닿았을 때 카메라의 추적 멈춤.
- 추적 대상이 조금만 움직여도 카메라가 많이 움직이는 상황 방지할 때 쓸 수 있음.
- Soft Zone Width, Height : 카메라의 추적 대상이 움직일 수 있는 범위 조절. Width, Height를 늘리면 캐릭터가 움직일 수 있는 범위(파란 영역)가 늘어남.
- Bias : Soft zone 위치를 어디로 줄지.
Noise
Noise Profile
- Shake 흔들림
- Wobble 지진난 것마냥 흔들림
- Handheld 손으로 들고 찍은 느낌
- Orthographic 카메라를 사용해서 2D처럼 보이게 하고 있는데 Handheld를 사용하면 X축 회전을 해서 3D로 보이게 된다.
카메라 이동 범위 한계 설정하기
- Cube 만들어 MeshRenderer 꺼주면 Colider만 남아있게 됨. 이 큐브의 크기를 카메라가 움직일 수 있는 범위만큼 설정해줄 것.
- Virtual 카메라 Component에서 Add Extention - Cinemachine Confiner 3D 추가
- Bounding Volume에 제한 범위가 될 Cube 넣어줌.
참고) Scene 창에서 큐브 움직여보면 카메라가 큐브의 범위를 벗어나지 못하고 큐브에 끌려옴.
Target Group
생성
- Transform 하나만을 추적하던 Virtual Camera의 Follow에서 톱니바퀴 누르고 Convert to TargetGroup 누르면 TargetGroup 오브젝트가 생성되고 알아서 Follow 대상이 TargetGroup으로 변경된다.
기능
- Target Group 안에 들어있는 모든 대상이 한 화면에 잡히게끔 함. 캐릭터 head와 목적지를 넣어놨다면 목적지에 가까워질수록 화면이 확대되는 것처럼 보임
- Radius 값으로 카메라의 화각 결정
- Weight 값으로 추적 대상 중 더 중요한 대상 결정
Target Group 사용 시 카메라 화각 (확대 범위) 조절
Target Group을 Follow하는 virtual camera의 인스펙터 창에 가보면 Body 옵션 아래에 새로운 항목이 추가되어 있다.
Orthographic
Orthographic 카메라인 경우 Minimum Ortho Size를 키우면 영 좁던 카메라 범위가 훨씬 넓어지는 것을 확인할 수 있다.
Perspective
Perspective 카메라인 경우 Minimum Ortho Size만 키우면 왜곡이 심해서 카메라 자체를 추적 대상으로부터 거리를 조금 멀리 해주는 것이 필요하다.
활성 카메라 변경 (Activate Camera With Distance)
현재 Script가 붙어 있는 대상은 플레이어이다. 플레이어가 특정 오브젝트와 가까워졌을 때 더 확대해서 보여주는 카메라를 사용하고 그 외에는 플레이어를 쫓아다니는 카메라 효과를 구현할 수 있다.
Initial Active Cam에는 플레이어를 Follow하는 virtual camera를, Switch Camera To에는 플레이어와 큐브 모두를 한 화면에 보여주는 TargetGroup이 적용된 virtual camera를 넣어준다.
- Object To Check에 거리 체크할 대상을 넣어둠.
- Script 붙은 오브젝트와 거리 체크할 대상 사이 거리 계산
- 거리가 Distance To Object보다 작아지면 Camera를 Switch Camera To로 변경. 거리가 Distance To Object보다 커지면 Camera를 Initial Active Cam으로 변경.
관련 Example 코드
using UnityEngine;
namespace Cinemachine.Examples
{
[AddComponentMenu("")] // Don't display in add component menu
public class ActivateCameraWithDistance : MonoBehaviour
{
public GameObject objectToCheck; // 거리 확인할 대상
public float distanceToObject = 15f;
public CinemachineVirtualCameraBase initialActiveCam; // objectToCheck에서 멀어질 때, 평소에 사용할 virtual cam
public CinemachineVirtualCameraBase switchCameraTo; // objectToCheck 가까워질 때 사용할 virtual cam
CinemachineBrain brain; // brain component 달린 메인 카메라
void Start()
{
brain = Camera.main.GetComponent<CinemachineBrain>();
SwitchCam(initialActiveCam); // active cam으로 전환
}
// Update is called once per frame
void Update()
{
if (objectToCheck && switchCameraTo)
{
if (Vector3.Distance(transform.position, objectToCheck.transform.position) < distanceToObject)
{
SwitchCam(switchCameraTo);
}
else
{
SwitchCam(initialActiveCam);
}
}
}
public void SwitchCam(CinemachineVirtualCameraBase vcam)
{
if (brain == null || vcam == null)
return; //brain, virtual cam 없을 경우 그냥 리턴
if (brain.ActiveVirtualCamera != (ICinemachineCamera)vcam) // brain의 active virtual cam이 vcam이 아닐 경우 Priority Queue에서 위로 옮김. 즉 바꾸려는 카메라의 우선도를 높임.
vcam.MoveToTopOfPrioritySubqueue();
}
}
}
3D에서의 Cinemachine
Virtual Camera
Follow에 추적 대상인 캐릭터 넣어줌
Lens
- Vertical FOV : 키우면 화각 넓어짐
- Dutch : 카메라를 z축으로 기울임
Aim
Body
Tracked Object Offset 이용해 Follow 대상 위에 추적 지점 설정. 사람 캐릭터라면 어깨나 머리 정도에 추적 지점 오도록.
POV
- 마우스로 상하좌우 회전할 수 있음.
- Value Range로 카메라 회전의 최솟값, 최댓값 설정.
- Vertical Axis에서 최소는 -10 정도로 제한을 주어 카메라가 아예 바닥을 뚫고 내려가지는 않게 설정 가능.
- Accel Time 카메라 움직이기 시작하는 데 걸리는 시간
- Decel Time 카메라 멈추기까지 걸리는 시간. 크기 너무 키우면 카메라 회전 멈추지 않고 계속 돌아감.
카메라가 벽 뚫는 문제 해결
Virtual camera 속성 중 Extentions에서 Cinemachin Collider 추가
버튼 눌렀을 때 카메라 전환
Left control 눌렀을 때 aim 카메라로 전환하며 조준점 UI 띄우는 예제
using UnityEngine;
public class ActivateOnKeypress : MonoBehaviour
{
public KeyCode ActivationKey = KeyCode.LeftControl;
public int PriorityBoostAmount = 10;
public GameObject Reticle; // 조준점
Cinemachine.CinemachineVirtualCameraBase vcam;
bool boosted = false;
void Start()
{
vcam = GetComponent<Cinemachine.CinemachineVirtualCameraBase>();
}
void Update()
{
if (vcam != null)
{
if (Input.GetKey(ActivationKey))
{
if (!boosted)
{
vcam.Priority += PriorityBoostAmount; // increase priority of cam while activation key is pressed
boosted = true;
}
}
else if (boosted)
{
vcam.Priority -= PriorityBoostAmount;
boosted = false;
}
}
if (Reticle != null)
Reticle.SetActive(boosted);
}
}
벽 쪽에 붙은 캐릭터 화각 벗어나는 문제 해결
- Virtual Camera의 Cinemachine collider - Camera Radius 적당히 작은 값으로 수정 (0.22)
- 너무 크면 화각을 벗어나고 너무 작으면 캐릭터 몸 뚫고 보여줌
- Virtual Camera의 Cinemachine collider - Strategy - Pull Camera Forward로 수정
결과
Cinemachine State Driven Camera
애니메이터 상태에 따라 사용하는 카메라 전환 가능.
가만히 있을 때는 멀리서 바라보는 카메라, 걸을 때는 캐릭터에게 확대된 화면을 사용하고 싶다면 각각의 Virtual 카메라를 따로 준비한 뒤 State에 따라 어떤 카메라를 사용할지 결정하면 된다.
- 상태를 받아오기 위해 Animated Target에 Animator 가지고 있는 오브젝트 추가.
- Virtual Camera Children에 전환하고 싶은 카메라 추가.
- Animator 상의 State를 설정하고 해당 State일 때 어떠한 카메라 사용할 것인지 설정.
후기
Cinemachine은 인게임 카메라 뷰를 설정하기 좋을 뿐만 아니라, 활용해서 게임 트레일러 같은 영상을 찍는 것에도 활용될 수 있다. 따라서 잘만 활용한다면 좋은 툴이 될 수 있을 것이다. 라이언과 춘식이 옷 입히기를 할 때 가장 아쉬운 것이 기존 메인 카메라가 뒷모습만 비추는 카메라여서 앞모습을 볼 수 없다는 점이었는데, 시네머신을 활용해 인벤토리를 열 때는 캐릭터의 앞모습이 보이게끔 가상 카메라를 설정해둬도 좋겠다는 생각이 들었다.
이번주는 유니티 공부보다도 알고리즘 공부를 더 열심히 했다. 비록 쉬운 기초다지기 문제이지만 아침 9시부터 저녁 6시까지 대충 16문제를 풀기도 했다.
다음주에는 만들던 게임을 마저 완성해야겠다. 대학원생의 모험 컨셉 병맛 게임인데, 랩실 가져가서 박사님 보여드렸더니 꽤 마음에 들어 하시더라.
유데미코리아 바로가기 : https://bit.ly/3b8JGeD
본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.
새로운 가능성의 시작, 유데미 x 웅진씽크빅
글로벌 최신 IT 기술과 실무 교육을 입문부터 심화까지! 프로그래밍, 인공지능, 데이터, 마케팅, 디자인 등 세계 최고의 강의를 경험하세요.
www.udemykorea.com
댓글