Chapter 12-3. 기타 : 낮과 밤

Date:     Updated:

카테고리:

태그:

인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click

낮과 밤 구현하기

image

Directional Light은 게임 내에서 전체적으로 쏴주는 빛이기 때문에 그 위치는 전혀 중요하지 않다. 중요한건 빛을 쏘는 방향이다. 이 방향에 따라 게임 월드의 낮 밤과, 그림자가 변한다.

Directional LightSun 태양으로 사용할 것이다. 이렇게 Sun을 X 축을 중심으로 뺑뺑 회전시키면 낮과 밤을 바꿀 수 있다. Sun의 앞방향(Z축)이 아래를 향하면 빛이 아래를 향하는 것이므로 게임 월드가 밝아지고 위로 향하면 빛이 위를 향하는 것이므로 게임 월드는 어두워진다.

🚀 Fog

✈ Fog 란?

image

그러나 이렇게 밤이 되어도 여러 오브젝트들이 이렇게 그대로 다 보이게 된다. 밤에는 검정색 안개 Fog가 끼도록 하여 전체적으로 보이지 않게끔 해주면 된다.

image

Window - Rendering - Lighting Settings 에서 Fog에 관한 값을 줄 수가 있다.

image

  • Fog 사용할 것이기 때문에 체크.
    • 이게 체크 안되어있으면 스크립트로 아무리 Fog 값을 주어도 말짱 도루묵.
  • Color 👉 Fog의 색깔
  • Density 👉 Fog의 정도
    • 디폴트 상태는 낮이기 때문에 이렇게 설정해준 0.02 값은 낮의 Fog 값이다. 낮에는 잘 보여야 하니까 낮게.


📜DayAndNight

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DayAndNight : MonoBehaviour
{
    [SerializeField] private float secondPerRealTimeSecond; // 게임 세계에서의 100초 = 현실 세계의 1초

    private bool isNight = false;

    [SerializeField] private float nightFogDensity; // 밤 상태의 Fog 밀도
    private float dayFogDensity; // 낮 상태의 Fog 밀도
    [SerializeField] private float fogDensityCalc; // 증감량 비율
    private float currentFogDensity; 

    void Start()
    {
        dayFogDensity = RenderSettings.fogDensity;
    }

    void Update()
    {
        // 계속 태양을 X 축 중심으로 회전. 현실시간 1초에  0.1f * secondPerRealTimeSecond 각도만큼 회전
        transform.Rotate(Vector3.right, 0.1f * secondPerRealTimeSecond * Time.deltaTime);

        if (transform.eulerAngles.x >= 170) // x 축 회전값 170 이상이면 밤이라고 하겠음
            isNight = true;
        else if (transform.eulerAngles.x <= 10)  // x 축 회전값 10 이하면 낮이라고 하겠음
            isNight = false;

        if (isNight)
        {
            if (currentFogDensity <= nightFogDensity)
            {
                currentFogDensity += 0.1f * fogDensityCalc * Time.deltaTime;
                RenderSettings.fogDensity = currentFogDensity;
            }
        }
        else
        {
            if (currentFogDensity >= dayFogDensity)
            {
                currentFogDensity -= 0.1f * fogDensityCalc * Time.deltaTime;
                RenderSettings.fogDensity = currentFogDensity;
            }
        }
    }
}

이 스크립트를 Sun에 붙인다.

  • Fog 와 관련된 것은 RenderSettings에서 가져올 수 있다. (Window - Rendering - Lighting Settings 에서의 Fog를 가져옴)
    • RenderSettings.fogDensity 👉 Fog 밀도 값.
  • 태양은 매프레임마다 계속 X 축을 중심으로 회전한다.
    • Vector3.right가 바로 X 축! (1, 0, 0) Vector3.right을 중심으로 1 초에 0.1f * secondPerRealTimeSecond만큼 회전
      • secondPerRealTimeSecond를 100으로 설정했다면 1초에 10도씩 태양이 회전하는 것이다. 그러면 실제 시간으로 36초가 게임 상에서의 24시간이 될 것이다!
  • 밤이면 낮의 Fog 값에서 밤의 Fog 값으로 변경해야 한다.
    • 이를 1초에 0.1f * fogDensityCalc씩 더하여 천천히 currentFogDensity을 밤의 Fog 값으로 만든다.
  • 낮이면 밤의 Fog 값에서 낮의 Fog 값으로 변경해야 한다.
    • 이를 1초에 0.1f * fogDensityCalc씩 빼서 천천히 currentFogDensity을 낮의 Fog 값으로 만든다.

image

image

검은색 안개가 0.1 값으로 끼게 되니까 이젠 진짜 잘 안보인다!



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 3 카테고리 내 다른 글 보러가기

댓글 남기기