유니티 C# 태양 움직임 밤과 낮 시간 흐름 간단 구현 Skybox Sun

반응형

코드 작성

using UnityEngine;

public class SunController : MonoBehaviour
{
    // 낮과 밤의 Skybox 머티리얼
    public Material daySkybox;
    public Material nightSkybox;

    // 태양 역할을 하는 Directional Light
    public Light sun;

    // 하루의 시간을 초 단위로 설정 (예: 120초)
    public float dayDuration = 120f;

    // 현재 시간을 추적하는 변수
    private float time;

    void Start()
    {
        // 초기화
        time = 0f;
        UpdateSkyboxAndLighting();
    }

    void Update()
    {
        // 시간 업데이트
        time += Time.deltaTime;

        // 하루가 끝나면 시간을 초기화
        if (time > dayDuration)
        {
            time = 0f;
        }

        // 태양의 위치와 Skybox를 업데이트
        UpdateSunPosition();
        UpdateSkyboxAndLighting();
    }

    void UpdateSunPosition()
    {
        // 낮과 밤의 비율 계산
        float dayRatio = time / dayDuration;

        // 태양의 각도 계산 (0에서 360도)
        float sunAngle = dayRatio * 360f;

        // 태양의 위치를 업데이트
        sun.transform.rotation = Quaternion.Euler(sunAngle - 90f, 170f, 0f);
    }

    void UpdateSkyboxAndLighting()
    {
        // 낮과 밤의 비율 계산
        float dayRatio = time / dayDuration;

        // 낮일 때 Skybox와 조명 설정
        if (dayRatio < 0.5f)
        {
            RenderSettings.skybox = daySkybox;
            sun.intensity = Mathf.Lerp(0.1f, 1f, dayRatio * 2); // 아침에서 낮으로
            sun.color = Color.Lerp(Color.red, Color.white, dayRatio * 2); // 일출 색상 변화
        }
        else
        {
            RenderSettings.skybox = nightSkybox;
            sun.intensity = Mathf.Lerp(1f, 0.1f, (dayRatio - 0.5f) * 2); // 낮에서 저녁으로
            sun.color = Color.Lerp(Color.white, Color.blue, (dayRatio - 0.5f) * 2); // 일몰 색상 변화
        }

        // Skybox가 변경되었음을 Unity에 알림
        DynamicGI.UpdateEnvironment();
    }
}
반응형