본문 바로가기
C#

[C#][Unity] 낮과 밤 만들기

by teamnova 2022. 7. 30.

안녕하세요.

오늘은 c# 유니티로 낮과 밤을 만들어 보겠습니다.

 

유니티 버전 - 2021.3.4f1

구현하기에 앞서  window - package manger 에서 Unity Registry -  Universal RP 를 설치합니다

 

그 다음,  전체 빛설정을 하기 위해 project에서 오른쪽 클릭 - create - rendering - urp asset(universal) 을 생성합니다.

 

 

저 두개의 파일이 생성 될 것입니다. 그 다음, 상단의 메뉴 중에서 편집(edit) - 프로젝트 세팅에 들어갑니다. 그래픽스에서 URP Global setting - scriptable render pipline setting 에 위에서 생성한 Asset을 다음과 같이 추가합니다.

그러면 기본 설정이 끝났습니다,

본격적인 구현을 위해 Globallight를 생성하겠습니다.

Hierachy에서 오른쪽클릭 - light - global light 2D 를 생성합니다.

 

그리고 이어서 Hierachy - UI - Text 를 생성합니다.

그러면 아래 이미와 같은 오브젝트들이 생성됩니다.

 

 

 

먼저, 싱글톤 게임매니저에서 낮과 밤 구현을 위한 컨트롤러 스크립트를 작성합니다.

(싱글톤과 게임매니저는 이전에 작성된 포스팅을 참고해주세요.)

https://stickode.tistory.com/178?category=937544

 

[C#][Unity] 싱글톤 패턴(Singleton) 설명

안녕하세요! 이번 포스팅은 유니티에서의 싱글톤패턴에 대한 포스팅 입니다! 싱글톤이란 프로그래밍 디자인 패턴 중 게임에서 가장 빈번하게 쓰이는 패턴중 하나인데요! 싱글톤 패턴은 오직 한

stickode.tistory.com

//DayTimeController

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


public class DayTimeController : MonoBehaviour
{   
    const float secondsInDay = 86400f; //하루를 초로 계산
    [SerializeField] Color nightLightColor;
    [SerializeField] AnimationCurve nightTimeCurve; //서로다른 값을 자연스럽게 섞으면서 바꿔주기
    [SerializeField] Color dayLightColor = Color.white; //낮 빛색;
    float time;
    [SerializeField] float timeScale = 60f; //1초가 1분처럼 
    [SerializeField] Text text;
    [SerializeField] Light2D globalLight;

    private int days;

    float Hours{
        get{
            return time / 3600f;
        }
    }

    float Minutes{
        get{
            return time % 3600f / 60f;
        }
    }
    private void Update()
    {
        time += Time.deltaTime * timeScale; 
        int hh = (int)Hours;
        int mm = (int)Minutes;
        text.text = hh.ToString("00") + " : " + mm.ToString("00"); //"" 입력값 자리수로 출력 01 02 ... 24
        float v = nightTimeCurve.Evaluate(Hours); //시간의 커브값 받기
        Color c = Color.Lerp(dayLightColor, nightLightColor, v); // (a,b,r) a와 b사이의 t(0~1) 비율에 위치한 색반환
        globalLight.color = c;
        if(time > secondsInDay){
            NextDay();
        }
    }

    private void NextDay(){
        time = 0;
        days += 1;
    }
}

 

그러면 아래와 같이 게임매니저에 Day Time Controller가 생성됩니다.

NightLightColor 에 밤이 되었을때 바뀔 색을 설정해주세요. 

그리고 텍스트와 GlobalLight에 위에서 생성한 파일을 드래그해서 설정해 줍니다.

 

그다음 Night Time Curve를 통해 낮과 밤의 주기를 설정해 보겠습니다.

 

0~ 24 까지로 24시간을 구현하겠습니다. 1 은 밤. 0은 낮을 의미합니다. 저는 7시를 일출 20시를 일몰로 설정했습니다.

 

설정을 하고나서 24시의 오른쪾 클릭으로 pingpong 설정을 하게되면 끊기지 않고 계속 이어지게 됩니다.

 

이제 실행해보겠습니다.

 

 

'C#' 카테고리의 다른 글

[C#][Unity] 상자 열고 닫기  (0) 2022.08.12
[C#][Unity] Getkey, GetKeyDown, GetKeyUp  (0) 2022.08.01
[C#][Unity] 현재 마우스 좌표 알아내기  (0) 2022.07.17
[C#][Unity] 현재 시각 가져오기  (0) 2022.07.02
[C#][Unity] 충돌 감지  (0) 2022.06.17