안녕하세요.
오늘은 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
//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 |