본문 바로가기
개발/Unity

유니티 - 슬라이더로 안개 조절하기 (Unity Fog Slider)

by 피로물든딸기 2022. 3. 27.
반응형

Unity 전체 링크

 

참고

- 타임 슬라이더 만들기

- Light Rotate로 간단히 낮과 밤 구현하기

- 슬라이더로 안개 조절하기

 

안개 효과를 주기 위해 Window > Rendering > Lighting으로 들어간다.

 

Environment 탭을 누르면 아래와 같이 Fog를 설정할 수 있다.

 

Fog에 check를 하고 Density를 조절하면 안개 효과가 나는 것을 볼 수 있다.

Fog - Mode는 Linear/Exponential/ExponentialSquared로 선택할 수 있다.

 

여기에서는 슬라이더를 이용해 스크립트로 Fog를 enabled 처리하고 Density를 변경한다.


타임 슬라이더로 낮과 밤을 구현한 곳에 슬라이더를 추가하여 안개 효과를 내보자.

FogSlider와 FogText를 추가하고 Canvas의 적절한 위치에 배치한다.

 

TimeManager.cs에 최소, 최대 안개 밀도를 정하고 Slider와 Text를 추가한다.

    const float MIN_FOG_DENSITY = 0.0f;
    const float MAX_FOG_DENSITY = 0.5f;
    
    public Slider fogSlider;
    public Text fogText;

 

Start에서 fog를 사용할 수 있도록 처리하고, fogSlider에는 fogChanged 함수를 추가한다.

RenderSettings에서 fog를 설정한다.

    void Start()
    {
        RenderSettings.fog = true;
        
        ...
        
        fogSlider.onValueChanged.AddListener(delegate { fogChanged(fogSlider, fogText); });
        
        ...
    }

 

fogChanged는 slider의 value를 보고 적절히 값을 변환하도록 한다.

    public void fogChanged(Slider slider, Text text)
    {
        float diff = MAX_FOG_DENSITY - MIN_FOG_DENSITY;
        float value = MIN_FOG_DENSITY + (diff * slider.value); // 0 ~ 1의 값

        text.text = "FOG" + " " + value;

        RenderSettings.fogDensity = value;
    }

 

아래와 같이 낮과 밤을 변화시키면서 안개 효과도 줄 수 있다.

 

최종 코드는 아래와 같다.

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

public class TimeManager : MonoBehaviour
{
    const int MIN_TIME_VALUE = 0;
    const int MAX_TIME_VALUE = 86400; // 24 * 60 * 60

    const float MIN_FOG_DENSITY = 0.0f;
    const float MAX_FOG_DENSITY = 0.5f;

    public Slider timer;
    public Text timeText;

    public Slider fogSlider;
    public Text fogText;

    public Light sunLight;
    private Vector3 initAngle;

    public string startZero(int num)
    {
        return (num < 10) ? "0" + num : "" + num;
    }

    public void valueChanged(Slider slider, Text text)
    {
        int diff = MAX_TIME_VALUE - MIN_TIME_VALUE;
        int value = MIN_TIME_VALUE + (int)(diff * slider.value); // 0 ~ 1의 값

        string h, m, s;
        int hh = value / 3600;
        int mm = (value % 3600) / 60;
        int ss = (value % 60);

        h = startZero(hh);
        m = startZero(mm);
        s = startZero(ss);

        text.text = "Time" + " " + h + " : " + m + " : " + s;

        sunLight.transform.rotation 
            = Quaternion.Euler(slider.value * 360.0f + 270.0f, initAngle.y, initAngle.z);
    }

    public void fogChanged(Slider slider, Text text)
    {
        float diff = MAX_FOG_DENSITY - MIN_FOG_DENSITY;
        float value = MIN_FOG_DENSITY + (diff * slider.value); // 0 ~ 1의 값

        text.text = "FOG" + " " + value;

        RenderSettings.fogDensity = value;
    }

    void Start()
    {
        RenderSettings.fog = true;
        initAngle = sunLight.transform.localEulerAngles;

        timer.onValueChanged.AddListener(delegate { valueChanged(timer, timeText); });
        fogSlider.onValueChanged.AddListener(delegate { fogChanged(fogSlider, fogText); });

        DateTime dt = DateTime.Now;
        int HH = Int32.Parse(dt.ToString("HH"));
        int mm = Int32.Parse(dt.ToString("mm"));
        int ss = Int32.Parse(dt.ToString("ss"));

        timer.value = (float)(HH * 3600 + mm * 60 + ss) / MAX_TIME_VALUE;
    }
}

참고 

: 안드로이드에 적용하기 위해서는 Environment에서 Fog를 check 해야 한다.

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글