Action disabled: source

카메라(Camera)

카메라(Camera)는 플레이어에게 세상을 캡쳐해서 보여주는 장치이다. 카메라의 커스터마이징과 조작을 통해 사용자의 게임을 진정으로 특별하게 보여줄 수 있다. 하나의 씬에는 무제한의 카메라를 놓을 수 있다. 카메라를 씬의 원하는 렌더 순서로, 어떤 위치에서나, 원하는 어떤 특정 부분도 보여줄 수 있도록 설정할 수 있다.


유니티의 유연성있는 카메라 객체

Properties

Clear Flags 화면의 어떤 부분이 제거될지 정한다. 이것은 다른 게임 요소를 끌어오기 위하여 카메라를 사용할때 편리한다.
Background 뷰의 모든 요소가 그려지고 스카이박스(skybox)가 없을 때 화면의 나머지 부분에 적용되는 색.
Culling Mask 카메라의 의해 렌더될 객체 레이어를 추가나 삭제한다. 인스펙터에서 객체에 레이어를 적용하라.
Projection 퍼스펙티브(perspective)를 시뮬레이션 하는 카메라 기능을 작동시킵니다.
»>Perspective 카메라는 퍼스펙티브를 그대로 놔둔 채로 객체를 렌더링한다.
»>Orthographic 카메라가 퍼스펙티브에 상관없이 객체를 균일(uniform)하게 렌더링한다.
Size (when Orthographic is selected) 카메라가 오쏘그래픽(Orthographic)으로 설정되어 있을 때의 뷰포트 크기.
Field of view 로컬 Y축을 따라 10진수 각도(degree)로 측정한 카메라 뷰 각도의 넓이(가로, width)
Clipping Planes 카메라가 렌더링을 시작하고 끝낼때까지의 거리.
»>Near 드로잉이 일어날 카메라에서 상대적으로 가장 가까운 점.
»>Far 드로잉이 일어날 카메라에서 상대적으로 가장 먼 점.
Normalized View Port Rect 스크린 좌표 0-1까지에서 화면 어디에 카메라의 뷰가 그려질지를 나타내는 네개의 값
»>X 카메라뷰가 그려질 수평의 시작 위치.
»>Y 카메라뷰가 그려질 수직의 시작 위치
»>W (Width) 화면에서 카메라 결과의 넓이(가로, width)
»>H (Height) 화면에서 카메라 결과의 높이.
Depth 그려지는 순서에서 카메라의 위치. 높은 값의 카메라가 낮은 값의 카메라보다 위에 그려진다.
Rendering Path 카메라에의해 어떤 렌더링 모델이 사용될지 정의하는 옵션.
»>Use Player Settings 이 카메라는 무엇이던 플레이어 세팅(Player Setting)에서 정해진 렌더링 경로(Rendering Path)를 이용한다.
»>Vertex Lit 이 카메라에 의해 렌더된 모든 객체는 버텍스릿(Vertex-Lit) 객체로 렌더된다.
»>Forward 유니티 2.x에서 표준이었던 데로, 모든 객체는 재질(Material) 당 한개의 패스(pass)로 렌더된다.
»>Deferred Lighting (Unity Pro only) 모든 객체는 조명없이 한번 그려진 후 렌더 큐(render queue)의 마지막에 모든 객체의 빛이 다 함께 렌더된다.
Target Texture (Unity Pro/Advanced only) 카메라 뷰의 결과를 포함하게 될 Render Texture에 대한 참조이다. 이 참조를 사용시 화면을 렌더링할 카메라의 기능이 비활성화된다.

Details

카메라는 플레이어에게 게임을 보여주는데 있어 필수이다. 이것은 상상할 수 있는 모든 효과를 내기위해 사용자 정의되고, 스크립팅, 또는 상속되어질 수 있다. 퍼즐 게임에서 카메라는 퍼즐을 전체 뷰에 고정되게 유지할 것이다. 일인칭 슈팅 게임에서는 카메라를 부모자식관계설정을 하여 그 카메라를 플레이어 캐릭터의 눈의 높이에 위치 시킬수 있다. 레이싱 게임에서는 사용자는 카메라가 플레이어의 차를 따라가기를 바랄 것이다.

사용자는 여러개의 카메라를 생성해서 각 카메라에 다른 깊이(depth) 값을 할당할 수 있다. 카메라는 낮은 깊이(depth)부터 높은 깊이(depth)로 그립니다. 다시 말해, 카메라의 깊이2는 깊이1의 것보다 위에 그려진다. 사용자는 화면에서의 카메라 뷰의 크기와 위치를 위해 노멀화된 뷰포트 사각형(Normalized View Port Rectangle)의 값을 조정할 수 있다. 이것은 미사일 캠, 맵 뷰 또는 백미러 뷰등의 여러 개의 작은 뷰들을 생성할 수 있다.

렌더 경로(Render Path)

유니티는 다른 렌더링 경로를 지원한다. 사용자는 게임의 컨텐츠, 타겟 플랫폼/하드웨어에 따라 어떤 것을 사용할지 정해야 한다. 다른 렌더링 경로는 다른 기능과 빛과 그림자에 주로 영향을 주는 성능의 특징을 가진다.
사용자 프로젝트에 의해 사용되는 렌더링 경로는 플레이어 세팅(Player Settings)에서 선택된다. 추가로, 사용자는 각 카메라에 그것을 오버라이드(override) 할 수 있다.

좀더 자세한 사항은 rendering paths page를 확인하라.

클리어 플래그(Clear Flags)

각 카메라는 뷰를 렌더할 때 색과 깊이 정보를 저장한다. 화면에서 그려지지 않는 부분은 빈 공간으로 기본적으로 스카이박스로 채워진다. 사용자가 여러 개의 카메라를 사용할 때, 각 카메라는 버퍼(buffers)에 자신의 색과 깊이 정보를 저장하며 각 카메라가 렌더하는 데이터를 쌓아 간다. 사용자 씬에서 어떤 특정 카메라가 뷰를 렌더링 할 때, 사용자는 Clear Flags를 설정하여 버퍼된 정보의 다른 쌓인 정보들을 제거(clear) 할 수 있다. 이것은 4가지 옵션 중에 하나를 택함으로써 행해진다:

스카이박스(Skybox)

이것이 기본 세팅이다. 화면의 빈 공간은 현재 카메라의 스카이박스를 보여줄 것이다. 만약 카메라가 스카이박스 설정을 가지고 있지 않으면 Render Settings (Edit→Render Settings)에서 선택된 스카이박스를 기본으로 사용한다. 그런 후에 배경색(Background Color)으로 가게 된다. 대안으로 Skybox component가 카메라에 추가될 수 있다. 새로운 스카이박스를 만들기를 원하면 스카이박스사용법 가이드를 이용하라.

단색(Solid Color)

화면의 빈 공간은 카메라의 백그라운드 색(Background Color)으로 그려진다.

깊이만(Depth Only)

플레이어의 총이 환경(environment) 공간 안에서 짤리지 않게 그려지기를 원하면 환경을 그릴 한 개의 카메라 깊이를 0으로 설정하고, 무기만을 그릴 카메라 깊이를 1로 설정하라. 그 무기 카메라의 클리어 플래그(Clear Flag)는 깊이만(Depth only)으로 설정해야 한다. 이것은 화면에서 주변 환경을 유지하고 3D 공간에 존재하는 각 객체가 있는 곳의 모든 정보를 버리게 한다. 총이 그려지면 불투명(opaque)한 부분이 총이 벽에서 얼마나 가깝냐에 상관없이 모든 그려진 것을 커버한다.


총은 그 전에 있던 카메라의 깊이 버퍼(depth buffer)를 지운 후에 마지막에 그려진다.

제거하지 않기(Don't Clear)

이 모드는 색상이나 깊이 버퍼 아무 것도 제거하지 않는다. 결과로 각 프레임이 위에 덮여 씌워지고 이것은 그림이 번진 것 같은(smear-looking) 효과를 냅니다. 이것은 게임에서 잘 사용되지 않으며 사용자 정의된 커스텀 셰이더와 함께 사용하는 것이 가장 좋다.

클립 평면 (Clip Planes)

"근접(Near)"과 "원거리 클립 평면(Far Clip Plane)" 속성은 카메라의 뷰가 시작되고 끝나는 지점을 결정한다. 평면들은 카메라의 방향에 수직으로 놓여있고 그것의 위치에서 측정이 된다. 근접(Near) 평면은 렌더될 가장 가까운 곳이며 원거리(Far) 평면은 가장 먼 곳이다. 클립핑 평면은 또한 어떻게 깊이 버퍼 정확도가 화면에 분배되는지를 결정한다. 일반적으로 높은 정확도를 위해서는 근접 평면을 최대한 멀리 한다. Near/Far 평면 그리고 카메라의 뷰의 필드에 의해 정의된 평면은 널리 알려진 카메라 프러스텀(시야절두체, frustum)을 설명한다. 유니티는 객체를 렌더링할 때 완전 이 시야절두체(frustum) 밖에 있는 객체는 보여주지 않는다. 게임에서 오클루젼 컬링(Occlusion Culling)을 사용하는가에 상관없이 프러스텀 컬링(Frustum Culling)은 일어난다. 성능상의 이유로 사용자는 작은 객체들을 먼저 선택하기를 원할 것이다. 예를 들어, 작은 돌과 잔해들은 큰 빌딩보다 훨씬 작은 거리로 보이지 않게 만들 수 있다. 이렇게 하기 위해서는 작은 객체를 개별 레이어에 넣고 Camera.layerCullDistances 스크립트 함수를 이용하여 레이어당 컬(cull) 거리를 설정한다.

컬링 마스크(Culling Mask)

컬링 마스크(Culling Mask)는 레이어를 사용하여 선택적으로 객체 그룹을 렌더링 하는데 사용된다. 레이어 사용에 관한 정보는 레이어를 보라. 일반적으로 유저 인터페이스를 다른 하나의 레이어에 두고 그 UI 레이어만을 위한 카메라로 따로 그것만을 렌더하는 것이 좋다. UI를 다른 카메라 뷰위에 보여지게 하기 위해서는 클리어 플래그(Clear Flag)를 깊이만(Depth only)으로 설정하고 UI 카메라의 깊이가 다른 카메라보다 높게 설정하라.

노멀화된 뷰포트 사각형(Normalized Viewport Rectangle)

노멀화된 뷰포트 사각형(Normalized Viewport Rectangle)이란 현재 카메라 뷰가 그려질 화면의 특정 부분을 정의하기 위해 있다. 사용자는 맵뷰를 화면의 오른쪽 하단에 또는 미사일-끝(Missile-tip) 뷰를 왼쪽 상단에 둘수 있다. 약간의 디자인 작업으로 뷰포트 사각형(Viewport Rectangle)을 독특한 행동을 만들어 내는데 쓸 수 있다. 노멀화된 뷰포트 사각형를 이용하여 이인용 플레이어 스플릿화면 효과를 내는 것은 쉽다. 두개의 카메라를 생성한 후 H 값을 모두 0.5로 설정하고, 플레이어1 의 Y값을 0.5로, 플레이어2의 값을 0으로 설정하면 된다. 이것은 플레이어1의 카메라를 화면의 중간부터 최상단가지 플레이어2의 카메라를 화면의 최하단에서 중간까지에 위치 시킵니다.


노멀화된 뷰포트 사각형을 사용한 두명의 플레이어 화면

오쏘그래픽(Orthographic)

정사영(正射影); 정투영(正投影); 직각 투영

카메라를 오쏘그래픽(Orthographic)으로 제작하면 카메라 뷰에서 모든 퍼스펙티브 투영이 제거된다. 이것은 쿼터뷰(isometric)나 2D게임을 만드는데 아주 유용한다. 안개는 오쏘그래픽 카메라 모드에서 균일(uniform)하게 렌더되므로 예상한대로 보이지 않을 수도 있다. 자세한 이유는 component reference on Render Settings을 보라.


퍼스펙티브 카메라


오쏘그래픽 카메라. 여기선 객체가 거리에 따라 작아지지 않는다!

렌더 텍스쳐(Render Texture)

이 기능은 유니티 고급 라이센스에만 있다. 이것은 카메라의 뷰를 텍스쳐에 위치시켜서 다른 객체에 적용할 수 있게 한다. 이것은 스포츠 공간의 비디오 모니터, 감시 카메라, 반사 등을 생성하기 쉽게 한다.


라이브 공간 카메라(Live arena-cam)를 생성하기 위해 사용된 렌더 텍스쳐.

힌트

  • 카메라는 다른 게임오브젝트들처럼 인스턴스화, 부모자식관계설정, 스크립트화 될 수 있다.
  • 레이싱 게임에서 속도감을 늘리기 위해 높은 시야각(Fild of View)을 사용하라.
  • 카메라는 강체(Rigidbody) 컴포넌트를 추가하면 물리 시물레이션에서 사용 될 수 있다.
  • 씬에서 사용할 수 있는 카메라 수는 제한이 없다.
  • 오쏘그래픽 카메라는 3D 유저 인터페이스를 만드는데 유용한다.
  • 만약 바짝 붙은 면들끼리 깜박거리는 깊이 깨짐현상(depth artifacts)이 있다면 근접평면(Near Plane)을 가능한 크게 설정하라.
  • 카메라는 게임 화면과 렌더 텍스쳐에 동시에 렌더할 수 없다. 둘 중에 하나에만 가능한다.
  • 프로 라이센스를 가진 사용자에게는 조금 더 특별한 효과를 위해 카메라 뷰를 텍스쳐에 렌더링 할 수 있는 렌더투텍스쳐(Render-to-Texture)라는 옵션이 있다.
  • 유니티는 사전 설치된 카메라 스크립트들을 가지고 있는데 Components→Camera Control에 있다. 무엇이 가능한지 그것들로 실험해 보라.

추적카메라(Chasing camera)

using UnityEngine;
using System.Collections;
 
public class CameraFollow : MonoBehaviour
{
    public Transform target;            // The position that that camera will be following.
    public float smoothing = 5f;        // The speed with which the camera will be following.
 
    Vector3 offset;                     // The initial offset from the target.
 
    void Start ()
    {
        // Calculate the initial offset.
        offset = transform.position - target.position;
    }
 
    void FixedUpdate ()
    {
        // Create a postion the camera is aiming for based on the offset from the target.
        Vector3 targetCamPos = target.position + offset;
 
        // Smoothly interpolate between the camera's current position and it's target position.
        transform.position = Vector3.Lerp (transform.position, targetCamPos, smoothing * Time.deltaTime);
    }
}

참고 유니티 튜토리얼

역링크