Unity C# > 컴포넌트 : Camera 와 프로퍼티/함수 모음
카테고리: UnityDocs
태그: Unity Game Engine
공부하면서 알게된 것만 정리합니다.😀
👩🦰 Camera
🚀 에디터

✈ Clear Flags
- SkyBox
- 스카이 박스라 불리는 배경으로 빈 공간을 채운다.
- Solid Color
- 단색으로 빈 공간을 채운다.
- Depth Only
- 빈 공간을 투명 처리한다.
- 이와 같은 특성 때문에 여러 대의 카메라를 한 화면에 합성할 때 주로 사용한다.
- 각 여러 카메라들의 영상들을 합성하기 위해선 각각의 카메라가 찍는 화면의 빈 공간은 투명해야 하기 때문이다.
- 유니티는 여러대의 카메라가 있으면 depth 값이 낮은 카메라부터 먼저 렌더링 하여 차곡 차곡 쌓아서 그린다. 즉, depth 값이 낮은 카메라가 가장 먼저 그려지고 그 위에 depth 값이 높은 카메라가 덮어 씌워져 그려지게 된다.
- Don’t Clear
- 화면을 새로 갱신하지 않고 이전의 화면 위에다가 다시 그린다. 때문에 오브젝트가 움직이면 잔상이 화면에 남는다.
✈ Background
- Solid Color를 선택하여 빈 공간을 배경 색으로 채우기로 했을 때 설정할 배경 색.
✈ Field Of View
카메라 시야 각도. 60도가 디폴트다.
✈ Culling Mask
- 렌더링 할 레이어들을 다중 선택한다. 오직 체크된 Layer를 가진 오브젝트들만 이 카메라에 렌더링 된다.
- 예를들어 “A” 레이어만 선택했다면 해당 카메라는 “A” Layer를 가진 그 오브젝트만 렌더링하여 화면에 담는다.
- Culling Mask 에 체크 되지 않은 레이어를 가진 오브젝트는 그림자조차 렌더링 되지 않는다.
- Solid Color를 선택했다면 빈공간은 단색, Depth Only를 선택햇다면 빈공간은 투명할 것이다.
- 예를들어 “A” 레이어만 선택했다면 해당 카메라는 “A” Layer를 가진 그 오브젝트만 렌더링하여 화면에 담는다.
- Clipping Planes
- 카메라는 모든 공간을 다 렌더링 하지 않는다. Near 평면과 Far 평면 사이에 해당하는 3 차원 공간만 렌더링 하여 카메라 화면에 담는다.
- Near 값을 최소값인 0.01로 설정하여 최대한 카메라와 가까운 거리도 다 렌더링 될 수 있도록 하였다.
- 팔을 뻗을 때 팔 아랫부분이 렌더링 되지 않고 잘렸던 이유는 Near 값이 높아 카메라가 렌더링 하는, 즉 찍는 시작점이 카메라로부터 멀었기 때문이다. Near 값을 줄여 카메라 바로 앞 거리도 렌더링 하게 됨으로써 팔 아랫부분이 렌더링 되지 않는 현상을 해결하였다.

- Depth 👉 해당 카메라가 그려지는 순서.
- 유니티니는 카메라 오브젝트가 여러개일 때, Depth 값이 낮은 카메라가 찍는 화면부터 렌더링을 먼저 하고 그 위에 차곡 차곡 쌓아 Depth 순서대로 카메라들의 화면을 렌더링 한다.
- depth 값이 낮은 카메라일 수록 먼저 렌더링 된다. depth 값이 높은 카메라일 수록 제일 나중에 렌더링 되므로 가장 나중에 덮어 씌우는 격이 된다. 더 우선시 되는 꼴.
- 메인 카메라는 기본 디폴트 Depth 값이 -1로서 주로 가장 먼저, 동시에 가장 밑에서 렌더링 된다는 것을 의미한다.
✈ Projection
- Perpective
- 하얀색 투영 선이 대각선이며 한 점으로 모인다.
- 멀리 있는건 작게 보이고 가까이 있는건 크게 보인다. 원근감 O
- Orthographic
- 하얀색 투영 선들이 평행하다.
- 멀리 있으나 가까이 있으나 크기가 똑같이 보인다. 원근감 X
- 2D 에서 많이 사용된다.
- 3D 에서 사용하면 ‘길건너 친구들’ 게임 처럼 3D면서도 원근감이 없는 독특한 시점이 연출 된다.
✈ Target Texture
카메라가 찍는 화면을 텍스처로서 만들 수 있다. 예를 들어 게임 내에서 CCTV를 사용한다면 그 CCTV 화면 텍스처를 실제로 뭐 다른 카메라 오브젝트가 촬영하는 화면으로 담을 수도 있고 캐릭터 선택 화면 등등 다양한 곳에서 사용할 수 있다. 미니맵 또한 이 기능으로 만들 수 있다! 맵 전체를 촬영하는 카메라를 두고 이 카메라가 찍는 화면을 텍스처로 만들면 될 듯 하다.
카메라에 기본으로 붙는 Audio Listener 컴포넌트는 마이크 같은 기능을 수행한다. 게임 주변의 소리를 녹음하고 플레이어의 스피커를 통해 재생한다. 이 AudioListener은 한 Scene에 한개만 존재해야 한다. 따라서 카메라를 여러개 생성하는 경우에는 일일이 다 이 Audio Listener 컴포넌트를 삭제해주자.
🚀 변수/프로퍼티
✈ Camera.main
“Main Camera” 태그가 붙은 현재 활성화 되어 있는 카메라.
✈ nearClipPlane
- 해당 카메라의 위치부터 렌더링을 시작할 최소 위치까지의 거리
- 카메라 컴포넌트에서
near값 리턴
- 카메라 컴포넌트에서
🚀 함수
화면 상의 좌표는 Screen 과 Viewport 가 있다. 이 둘을 구분해야 함.
✈ ViewportToWorldPoint
public Vector3 ViewportToWorldPoint(Vector3 position);
뷰포트상 좌표를 월드 좌표계로 변환하여 리턴한다.
- 호출한 카메라가 찍고 있는
Viewport상에서의 위치(x, y)와 카메라로부터의 거리(z)를 Vector3로 묶어 넘기면 그 위치를 실제 게임 월드의 위치로 리턴해준다.- 화면 좌표계
Screen👉 좌하단(0, 0) ~ 우하단(1280, 960) 같이 해상도 픽셀 단위의 화면 좌표계.- (0, 0) ~ (Screen.width, Screen.height) 의 범위를 가짐
Viewport👉 좌하단(0, 0) ~ 우하단(1, 1) 같이 해상도를 0 ~ 1 사이의 비율 단위로 나타낸 화면 좌표계
- 화면 좌표계
- 인수로 넘기는 Vector3의
z값은 카메라 오브젝트로부터 실제 카메라가 찍고 있는 화면까지의 실제 게임 월드 거리, 즉 카메라의 깊이를 의미한다. 카메라로부터의 거리.- (0.5f, 0.5f, 0.0f)를 넘겨준다는 것은 카메라 화면의 정중앙을 월드 좌표로 변환하되
z값은 카메라의 위치와 일치. (카메라로부터 거리 0 이므로)
- (0.5f, 0.5f, 0.0f)를 넘겨준다는 것은 카메라 화면의 정중앙을 월드 좌표로 변환하되
✈ ViewportPointToRay
public Ray ViewportPointToRay(Vector3 position);
- 카메라가 찍고 있는 화면
Viewport상의 위치를 Vector3로 넘기면 그 화면 상 위치를 가로지르는Ray를 리턴한다.- 과정
- 카메라 위치로부터,
Viewport상에서의 위치(인수의 x, y)를 카메라와의 거리(인수의 z)를 고려하여 월드 기준의 좌표로 변환한 좌표를 향하는 Ray 광선을 리턴한다.
- 카메라 위치로부터,
- 과정
✈ ScreenPointToRay
public Ray ScreenPointToRay(Vector3 pos);
public Ray ScreenPointToRay(Vector3 pos, Camera.MonoOrStereoscopicEye eye);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- 호출한 카메라 위치로부터 픽셀 단위의 화면상 좌표의 실제 월드 좌표로 향하는 방향의
Ray(광선)을 리턴한다.- 아래 과정은 위 함수 한 줄과 비슷하다. 아래 과정에다가 추가로 해당
dir로 향하는Ray를 직접 리턴한다.Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane)); Vector3 dir = mousePos - Camera.main.transform.position; dir = dir.normalized;
- 아래 과정은 위 함수 한 줄과 비슷하다. 아래 과정에다가 추가로 해당
- 마찬가지로 화면상 좌표(X, Y)와 함께 월드 좌표의 Z 값을 계산할 때 고려할 카메라와의 거리 또한 Z 로 함께 Vector3로 묶어 넘겨 준다.
- Raycast 에 시작 위치와 방향을 넘기는 대신 광선 자체인
ray를 넘겨준다.
✈ WorldToScreenPoint
public Vector3 WorldToScreenPoint(Vector3 position);
- 월드 좌표계 위치(Vector3)를 인수로 받아서 이를 카메라 화면 상의(
Screen) 위치로 변환하여 Vector2 를 리턴한다.Screen👉 좌하단(0, 0) ~ 우하단(1280, 960) 같이 해상도 픽셀 단위의 화면 좌표계Viewport👉 좌하단(0, 0) ~ 우하단(1, 1) 같이 해상도를 0 ~ 1 사이의 비율 단위로 나타낸 화면 좌표계
- 카메라가 투영 되면
z값은 무시된채 (x, y) 월드 좌표가Screen화면 좌표계로 변환될 것이다.
✈ ScreenToWorldPoint
public Vector3 ScreenToWorldPoint(Vector3 position);
- 픽셀 단위의 화면 좌표계 위치(x, y)와 월드 좌표 z 를 구하는데 사용할 카메라로부터의 원하는 거리(z) 를 Vector3로 묶어 넘기면 월드 좌표계로 변환해주고 이를 리턴해준다.
Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane));
- ScreenToWorldPoint 함수 👉 화면 좌표계를 월드 좌표계로 변환하고 리턴함
- ScreenToWorldPoint 에다가
- 마우스를 클릭한 화면상의 좌표(X, Y)와
- (0, 0) ~ (Screen.width, Screen.height) 범위를 가진다.
- 화면 상 좌표는 Z 값이 없다. 따라서 월드 좌표로서의 Z 값을 정할 때 고려할 카메라와의 거리 를 함께 Vector3로 묶어 넘겨 주어야 한다.
- 현재 카메라의 위치인
camera.main.transform.position.z값으로부터 Vector3로 함께 묶어서 넘긴z값(카메라부터의 거리)을 더해준 값을 화면 좌표계를 월드 좌표계로 변환했을 때의z값으로 삼는다.- 단지 인수로 넘겨주는 Vector3 의
z값은 이 값으로 월드z좌표로 삼겠다는게 아니라 이걸 카메라와의 거리로 받아들이고 이걸 고려해서 월드 좌표계 기준z로 만들겠다는 것이다. 착각 노노! z값 없이 화면 좌표계(X, Y)를 가지던 마우스 클릭한 곳을 월드 기준으로 전환한 좌표의z값은 위의 예로는 camera.main.transform.position.z + Camera.main.nearClipPlane 가 된다.- 카메라의
nearClipPlane은 카메라 컴포넌트의near. 카메라가 카메라로부터 렌더링을 시작하는 곳 까지의 z 축 기준의 거리
- 카메라의
- 단지 인수로 넘겨주는 Vector3 의
- 현재 카메라의 위치인
- 마우스를 클릭한 화면상의 좌표(X, Y)와
- 이렇게 세 가지 요소를 Vector3 로 묶어서 인수로 넘겨주면 적절한 월드 좌표계로 변환해준다.
- ScreenToWorldPoint 에다가

예를 들어 게임 화면 상에서 화면상 픽셀 좌표 기준으로 (160, 180)에 해당하는 픽셀에 마우스 클릭을 했다고 가정해보자. 이 좌표는 Vector3 로 보면 (160, 180, 0) 상태일 것이다. 화면상 좌표는 z 값 없이 2D 니까.. 클릭했던 이 (160, 180) 픽셀 좌표를 게임 월드 기준으로 변환하고자 ScreenToWorldPoint(Vector3(160, 180, 3)) 로 실행시켰다고 가정해보자. z값으로 넘긴 3 을 카메라와의 ‘거리’를 3 이라고 고려하여 화면상 좌표인 (160, 180)를 월드 기준 좌표로 변환했더니 (3.7, 4.8, -0.6)이 되었다. 현재 카메라 위치의 z 값 + 3 👉 - 0.6.
✈ ScreenToViewportPoint
public Vector3 ScreenToViewportPoint(Vector3 position);
- (0, 0) ~ (Screen.width, Screen.height)로 나타낼 수 있는 픽셀 좌표(
Screen)를 (0, 0) ~ (1, 1)로 나타내는Viewport, 즉 비율 좌표로 변환하여 리턴한다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기