일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 유한상태머신
- 코루틴
- 스택
- 프로그래머스
- 메서드
- 장애물달리기
- 직렬화
- Generic
- 비선형자료구조
- soundmanager
- 유니티
- 효과음
- 람다식
- FSM
- c#
- UI
- InputManager
- script
- invokec#events
- ObjectPool
- delegate
- 배열
- unity
- 자료구조
- 인터페이스
- BGM
- LINQ
- 스파르타내일배움캠프
- skybox
- inputsystem
- Today
- Total
Unity 개발일지
[Unity] SkyBox로 낮과 밤 구현하기 2 본문
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)
값을 모두 설정해주었을 때 모습이다.
낮과 밤이 바뀌는 모습이다.