본문 바로가기
제출용/TIL

내일배움캠프 40일차 TIL + 낮과 밤 구현

by 유린테 2024. 6. 12.

낮과 밤을 만들어 보아요~

재미있는 라이팅~ 우하하

 

 

DayAndNight 라는 빈 오브젝트를 만들고

거기 원래 잇던 다이렉션라이트를 넣고 복사해줌

원래 있던 다이렉션라이트가 Sun, 복사해준걸 Moon으로 하고 

Moon의 라이트 색을 밤의 푸른색으로 바꿔준다

 

DayNightCycle 스크립트를 만들고 DayAndNight에 컴포넌트로 달아준다.

public class DayNightCycle : MonoBehaviour
{
    [Range(0.0f, 1.0f)]
    public float time;  // 시간 0프로~100프로가 되는것이다
    public float fullDayLength;
    public float startTime = 0.4f; //time이 0.5일때 정오
    private float timeRate;
    public Vector3 noon; // 정오 (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; //반사

    private void Start()
    {
        timeRate = 1.0f / fullDayLength;  
        time = startTime;
    }

    private void Update()
    {
        time = (time + timeRate * Time.deltaTime) % 1.0f;

        UpdateLighting(sun, sunColor, sunIntensity);      //Sun호출
        UpdateLighting(moon, moonColor, moonIntensity);   //Moon호출

        RenderSettings.ambientIntensity = lightingIntensityMultiplier.Evaluate(time);  // 세팅값 접근하려면 RenderSettings. 해줘야함
        RenderSettings.reflectionIntensity = reflectionIntensityMultiplier.Evaluate(time);

    }

    void UpdateLighting(Light lightSource, Gradient colorGradiant, AnimationCurve intensityCurve)
    {
        float intensity = intensityCurve.Evaluate(time);

        lightSource.transform.eulerAngles = (time - (lightSource == sun ? 0.25f : 0.75f)) * noon * 4.0f;  //Sun time 0.5 정오일땐 90도가 되야하는데 360*0.5는 180도가 나와서 0.25를 빼줌
        lightSource.color = colorGradiant.Evaluate(time);                                                 //Noon 일때 90도를 곱해주는데 90에 0.25곱해도 90이 아니니 4 를 또 곱해줌
        lightSource.intensity = intensity;

        GameObject go = lightSource.gameObject; //해가 넘어간경우 꺼줘야함
        if (lightSource.intensity == 0 && go.activeInHierarchy)  //밝기가 0이 됐는데, 하이어라키에선 켜져있다면
            go.SetActive(false);                                 //꺼주세용
        else if (lightSource.intensity > 0 && !go.activeInHierarchy)  //밝기가 0보다 큰데, 하이어라키에서 안켜져있으면
            go.SetActive(true);                                       //켜주세용
    }
}

 

그리고 인스펙터창에서 Full Day Length 이런거 조절해주고 Sun이랑 Moon 각자 자리에 넣어주기

Sun Intensity 더블클릭하면 커브 조절하는 창이 뜬다!

 

Sun 

첫번째 

time 0.25일때

value 0

 

중간

time 0.5 일때

value 1

 

마지막

time 0.75 일때

value 0

 

 

Moon

time 0 

value 0.2 

 

time 0.2

value 0

 

time 0.8

value 0

 

time 1

value 0.2

 

 

Other Lighting

0,0       0.4,1         0.6,1          1,0

 

위 아래커브 둘 다 똑같이 해주기

색깔 그라데이션까지 넣어주면 이렇게 됩니다~

인텐시티값이랑 맞춰서 색깔 적용해줬음

 

그럼 이제 낮과 밤을 만들 수 있음

 

이렇게 커브 넣어서 조절하는 거인지 몰랐는데 아주 신기하다!