Unity 개발일지

[Unity] SkyBox로 낮과 밤 구현하기 2 본문

카테고리 없음

[Unity] SkyBox로 낮과 밤 구현하기 2

아머르 2024. 5. 29. 22:17

쨍쨍하다

 

Scene창을 잘 둘러보면 태양을 찾을 수 있는데 바로 Directional Light이다.

 

Directional Light의 Rotation X값을  조절해서 태양의 위치를 바꿀 수 있고, 0도일때 일출, 90도일 때 정오, 180도일 때 일몰을 볼 수 있다.

 

스크립트로 이 값들을 조절해서 낮과 밤을 구현해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

방에서 일몰을 볼 수 있다!

 

빈 오브젝트 DayAndNight를 만들고 Directional Light를 복사해서 하나는 Sun, 다른 하나는 Moon으로 만들어준다.

 

이 때 Moon의 Position을 바꿔도 태양이 움직이지 않는데

Sun(기존 Directional Light)이 Unity 설정에서 해 리소스로 들어가 있기 때문이다.

 

밤에 푸르스름한 조명효과를 주기 위해 Color를 1500FF로 설정해주었다.

 

이제 스크립트를 만들어주자.

 

먼저 사용할 변수들을 선언해주었다.

Range는 0~1인데 퍼센트라고 생각해주면 된다. (time이 0.5면 정오를 뜻함)

 

Gradient는 그라디에이션을 의미한다.

[AnimationCurve]

Unity에서 에니메이션의 키프레임(Keyframe)을 사용하여 값을 보간(interpolate)하는데 사용되는 클래스이다. 이 클래스를 사용하여 시간에 따라 값을 부드럽게 변화시키는 커브를 정의하고, 이를 기반으로 애니메이션을 만들 수 있다.

AnimationCurve 클래스의 기본적인 구성 요소는 Keyframe과 Interpolation Mode이다.

 

[Keyframe]

시간에 따른 값을 정의하는 점을 의미한다. 키프레임은 시간(t)과 해당 시간에 대응하는 값(value)으로 이루어진다.

 

[Interpolation Mode]

보간방식을 의미하며, 인접한 키프레임 사이의 값을 보간하는 방법을 지정한다.

기본적으로는 Cubic Bezier 보간이 사용되며, 선형, 스텝 등 다양한 보간 방식을 선택할 수 있다.

 

 

 

fullDayLength는 하루의 길이를 설정할 수 있고, startTime은 0.4로 설정해두었으니 하루의 40% (9시쯤) 부터 시작한다.

 

시간의 변화를 관찰하기 위해 Time.deltaTime을 더해주었고,

0.0에서 1.0 사이의 값으로 순환하도록 하기 위해 % 1.0f (나머지연산)을 해주었다.

 

UpdateLighting 함수를 만들어 Update에서 계속 Update되도록 해주었다.

 

float intensity = intensityCurve.Evaluate(time); 에서 Evaluate는 특정 시간에 해당하는 값을 보간하여 반환한다.

 

각도를 구할 때 time - (lightSource == sun ? 0.25f : 0.75f) 을 해준 이유는

정오일 경우 time이 0.5 이고 태양의 각도가 90도가 달의 각도는 270도가 되어야하는데 이 값을 보정해주기 위해서

작성하였다. ( noon * 4.0f 도 마찬가지 )

 

if문은 일몰, 일출 등의 상황에서 각각의 오브젝트를 켜고 끄도록 설정해주었다.

 

마지막으로 RenderSettings.ambientIntensity = lightingIntensityMultiplier.Evaluate(time); 에서는

Intensity값을 설정하기 위해 RenderSetting의 ambientIntensity로 접근했다.

 

오브젝트에 스크립트를 넣어주면 값들을 설정해줄 수 있다.

 

Full Day Length : 30

(빠른 변화를 관찰하기 위해 하루를 30초로 설정)

 

Noon 에는 90 / 0 / 0 (정오)

Sun과 Moon에는 각각 Sun, Moon 오브젝트를 넣어주었다.

 

Sun Color 는 그라데이션으로 설정할 수 있는데

Intensity 키값과 맞춰주기 위해

초기 값은 FFF638 그래프 중간을 더블클릭해서 값을 생성해준 후  Location을 40.0%로 지정해서 FFFFFF(흰색)으로 설정

 

Moon Color 는 0 - 1500FF / 40, 60 - 000000(검정) /

그리고 100 - 1500FF로 설정해준다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


가장 중요한 Intensity 값을 설정해주는 부분인데 클릭해주면 다음과 같은 창이 뜬다.

좌측 하단의 톱니바퀴 모양으로 만들어진 그래프를 쓸수도 있고, 기존 것을 설정한 후 New를 누르면 만들어둔 그래프를

저장할 수 있다.

 

[Sun의 AnimationCurve]

키값은 그래프를 더블클릭하면 생성시켜줄 수 있고 마우스 우클릭으로 지울 수 있다.

(0, 0) (0.4,1) (0.6, 1) (1, 0) 총 4개를 넣어주었다.

 

 

[Moon의 AnimationCurve]

키값 (0, 0.2) (0.3, 0) (0.7. 0) (1, 0.2) 4개를 설정해주었다.

 

Other Lighting도 위와 같은 방법으로설정해준다.

LightingIntensityMultiplier Key값 설정(time, value) - (0, 0) (0.4, 1) (0.8, 1) (1, 0)

ReflectionIntensityMultiplier Key값 설정(time, value) - (0, 0) (0.4, 1) (0.8, 1) (1, 0)

 

값을 모두 설정해주었을 때 모습이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

낮과 밤이 바뀌는 모습이다.

반응형