[TIL] 유니티 스카이박스 설정 및 활용
📖학습 내용
스카이박스(3D)
Unity 3D 에서 스카이박스는 씬(Scene)의 배경 전체를 감싸는 거대한 가상의 육면체 또는 구체이다. 마치 우리가 하늘을 바라볼 때 끝없이 펼쳐진 것처럼 보이도록 하는 역할을 하며, 게임의 분위기를 설정하고 몰입감을 높이는 데 중요한 요소이다.
스카이박스의 주요 역할
- 배경 구현 : 씬의 가장자리를 넘어선 공간을 채워준다. 플레이어가 씬의 경계에 도달했을 때 텅 빈 공간이 아닌, 마치 현실 세계처럼 하늘이나 특정 환경이 보이도록 한다.
- 광원 역할 : 스카이박스는 씬 전체에 영향을 미치는 주변광(Ambient Light)과 반사광(Reflected Light)의 소스로 사용될 수 있다. 이때 스카이박스의 색상과 밝기에 따라 전반적인 조명 톤이 결정된다.
- 분위기 연출 : 맑은 하늘, 흐린 날씨, 우주 공간 등 다양한 분위기를 스카이박스를 통해 효과적으로 표현할 수 있다.
스카이박스 생성 및 적용 방법
-
스카이박스 머터리얼(Material) 생성:
- 프로젝트 창에서
Create > Material을 선택하여 새 머터리얼을 생성한다. -
생성한 머터리얼을 선택하고 인스펙터 창에서
Shader드롭다운 메뉴를 클릭한다. Skybox카테고리에서 원하는 스카이 박스 선택:- 6 Sided : 6개의 개별 텍스쳐(앞. 뒤, 아래, 왼쪽, 오른쪽)를 사용하여 육면체 형태의 스카이박스를 만든다. 각 면에 서로 다른 이미지를 적용하여 정교한 표현이 가능함.
- Cubemap : 하나의 큐브맵 텍스쳐를 사용. 큐브맵은 6개의 정사각형 이미지가 하나의 텍스쳐로 합쳐진 형태.
- Panoramic : 하나의 파노라마 이미지(구형 혹은 원통형으로 펼쳐진 이미지)를 사용하여 구 형태의 스카이박스를 생성.
- Procedural : 코드를 통해 동적으로 하늘의 색상, 태양의 위치, 구름 등을 생성. 별도의 텍스쳐가 필요 없음.
- 프로젝트 창에서
-
텍스쳐 준비 및 적용 :
- 6 Sided: 서로 매끄럽게 이어지는 6개의 이미지를 준비. 인스펙터 창에서 각 방향에 맞는 텍스처 슬롯(Front, Back, Up, Down, Left, Right)에 이미지를 드래그 앤 드롭.
- Cubemap: 큐브맵 텍스처를 준비. Unity 에디터 내에서 6장의 이미지를 큐브맵으로 변환하거나, 외부 툴을 사용하여 생성할 수 있다. 인스펙터 창의 Cubemap (HDR) 슬롯에 큐브맵 텍스처를 할당하면 끝.
- Panoramic: 구형 또는 원통형 파노라마 이미지를 준비. 인스펙터 창의 Spherical (HDR) 슬롯에 이미지를 할당하면 끝.
- Procedural: 텍스처를 필요로 하지 않으며, 인스펙터 창에서 Sun Size, Atmosphere Thickness, Sky Tint, Ground Color 등의 속성을 조절하여 하늘의 모습을 변경할 수 있다.
-
씬(Scene) 에 스카이박스 적용 :
- 메뉴 바에서
Window > Rendering > Lighting을 선택하여 라이팅 창을 오픈. - 라이팅 창에서
Environment선택.
Skybox Material슬롯에 생성한 스카이박스 머터리얼을 할당.
- 메뉴 바에서
Procedural Skybox 를 활용한 낮과 밤 효과

3D 프로젝트 생성 시 기본으로 만들어져 있는 Directional Light 의 X Rotation 을 조절해보면, 하늘 위 태양처럼 떠있는 광원이 움직이는 것을 볼 수 있다.

해당 기능과 Animation Curve 기능을 활용하여 시간의 흐름에 따라 자연스러운 낮과 밤의 연출을 만들 수 있다.
일단 기존의 Directional Light 를 복사하여 달의 광원을 표현할 수 있도록 한다. 따라서 색상을 약간 푸르슴하게 변경한다.
그리고 두 개의 광원을 관리하는 스크립트를 작성해준다.
public class DayNightCycle : MonoBehaviour
{
[Range(0.01f, 1.0f)] //0~24 시
public float time;
public float fullDayLength;
public float startTime = 0.4f;
private float timeRate;
public Vector3 noon; //Vector 90 0 0
[Header("Sun")]
public Light sun;
public Gradient sunColor;
public AnimationCurve sunIntensity;
[Header("Moon")]
public Light moon;
public Gradient moonColor;
public AnimationCurve moonIntensity;
[Header("Other Lighting")]
public AnimationCurve lightingIntensityMultiplier;
public AnimationCurve reflectionIntensityMultiplier;
void Start()
{
timeRate = 1.0f / fullDayLength;
time = startTime;
}
void Update()
{
time = (time + timeRate * Time.deltaTime) % 1.0f;
UpdateLighting(sun, sunColor, sunIntensity);
UpdateLighting(moon, moonColor, moonIntensity);
// Evaluate 는 Inspector 에 그린 그래프에서 time을 입력받으면 특정 값을 return
RenderSettings.ambientIntensity = lightingIntensityMultiplier.Evaluate(time);
RenderSettings.reflectionIntensity = reflectionIntensityMultiplier.Evaluate(time);
}
void UpdateLighting(Light lightSource, Gradient gradient, AnimationCurve intensityCurve)
{
float intensity = intensityCurve.Evaluate(time);
// 하루 시간(0~1)과 해/달의 자전주기(0~360) 값을 동기화.
// 해와 달은 항상 180도 차이가 나기 때문에 0.5f(180/360) 차이
lightSource.transform.eulerAngles = (time - (lightSource == sun ? 0.25f : 0.75f)) * noon * 4f;
lightSource.color = gradient.Evaluate(time);
lightSource.intensity = intensity;
GameObject go = lightSource.gameObject;
if (lightSource.intensity == 0 && go.activeInHierarchy)
go.SetActive(false);
else if (lightSource.intensity > 0 && !go.activeInHierarchy)
go.SetActive(true);
}
}
이제 Sun, Moon 오브젝트의 Animation Curve를 설정해주면 끝이다.
구현 결과

결론
스카이박스는 Unity3D 프로젝트의 시각적인 품질과 몰입감을 크게 향상시킬 수 있는 강력한 기능이다. 다양한 종류의 스카이박스와 설정 옵션을 이해하고 프로젝트의 특성에 맞게 잘 활용한다면, 더욱 풍부하고 사실적인 가상 세계를 창조할 수 있을 것이다. 물론 프로젝트의 컨셉과 분위기에 맞는 스카이박스를 신중하게 선택하고, 조명과의 상호작용을 철저히 고려해야 최적의 결과를 얻을 수 있다.
댓글남기기