▶▷ 프로젝트 계획
와이어 프레임
아포칼립스 상황에서 좀비에게 감염되어 기존의 베이스 캠프에서 쫓겨난 플레이어가 치료를 받기 위해 다른 베이스 캠프를 찾아 생존하며 이동하는 컨셉의 프로젝트이다.
나무와 돌 등의 자원들을 채집하여 인벤토리에 보관 및 각종 아이템을 제작할 수 있다. 또한 음식과 물을 얻어 갈증과 허기를 회복할 수 있으며 장비를 장착하여 좀비와 전투를 할 수 있다.
▶▷ 밤/낮 사이클
생존 게임에서 필요한 요소인 낮과 밤을 구현하기 위해 Directional Light를 두개 만들어 각각 해와 달로 설정하였고 애니메이션 커브를 이용해 자연스럽게 어두워지고 밝아지도록 구현했다.
using TMPro;
using UnityEngine;
public class DayNightCycle : MonoBehaviour
{
// 0 ~ 1 사이의 값으로 하루 시간 표현
[Range(0.0f, 1.0f)]
public float time;
public float dayLength; // 하루의 길이
public float startTime = 0.4f; // 시작 시간
private float timeRate; // 시간 증가 속도
public Vector3 noon; // 정오(낮) 방향 벡터 설정
[Header("Sun")]
public Light sun;
public Gradient sunColor; // 시간에 따른 햇빛 색상 변화
public AnimationCurve sunIntensity; // 시간에 따른 햇빛량 변화
[Header("Moon")]
public Light moon;
public Gradient moonColor; // 시간에 따른 달빛 색상 변화
public AnimationCurve moonIntensity; // 시간에 따른 달빛량 변화
[Header("Other Lighting")]
public AnimationCurve lightingIntensityMultiplier; // 환경 조명 강도 변화
public AnimationCurve reflectionIntensityMultiplier; // 반사 강도 변화
public GameObject warningTxt;
private void Start()
{
timeRate = 1.0f / dayLength; // 하루 길이에 따라 시간 증가 속도 설정 (1초에 1/dayLength 만큼 증가)
time = startTime; // 시작 시간 초기화
}
private void Update()
{
time = (time + timeRate * Time.deltaTime) % 1.0f; // 매 프레임마다 시간 증가, 1 초과 시 0부터 다시 시작
// 햇빛, 달빛을 각각 업데이트
UpdateLighting(sun, sunColor, sunIntensity);
UpdateLighting(moon, moonColor, moonIntensity);
// 환경 조명과 반사 강도를 현재 시간에 따라 설정
RenderSettings.ambientIntensity = lightingIntensityMultiplier.Evaluate(time);
RenderSettings.reflectionIntensity = reflectionIntensityMultiplier.Evaluate(time);
if (time > 0.75f)
{
warningTxt.SetActive(true);
}
}
/// <summary>
/// 광원의 색상, 강도, 방향 등을 업데이트
/// </summary>
/// <param name="lightSource">업데이트 할 광원</param>
/// <param name="colorGradiant">변화 색상</param>
/// <param name="intensityCurve">시간에 따른 변화 강도</param>
void UpdateLighting(Light lightSource, Gradient colorGradiant, AnimationCurve intensityCurve)
{
float intensity = intensityCurve.Evaluate(time); // 현재 시간에 따른 강도 계산
// 광원 방향 설정 (해는 0.25, 달은 0.75의 오프셋을 주어 반대편에 위치)
lightSource.transform.eulerAngles = (time - (lightSource == sun ? 0.25f : 0.75f)) * noon * 4.0f;
lightSource.color = colorGradiant.Evaluate(time); // 현재 시간에 따른 색상 설정
lightSource.intensity = intensity; // 계산한 강도 적용
GameObject go = lightSource.gameObject; // lightSource가 속한 게임 오브젝트 참조
if (lightSource.intensity == 0 && go.activeInHierarchy) // 강도가 0이면 비활성화
go.SetActive(false);
else if (lightSource.intensity > 0 && !go.activeInHierarchy) // 강도가 0보다 크면 활성화
go.SetActive(true);
}
}
경고 텍스트는 일단 임시로 넣어 두었고 나중에 다른 방식으로 활성화 시킬 예정이다.
▶▷ 트러블 슈팅
막혔던 점
1. DefaultSkyBox가 아닌 다른 Material을 사용할 경우 해가 졌을 때 하늘은 어두워지지 않는 현상
시도한 점
1-1. 태양 오브젝트의 각도 조절
1-2. AnimationCurve의 곡선 조절
해결
1. 아직 하지 못함 (추후 수정)
'게임 개발 공부 기록' 카테고리의 다른 글
36일차 - Path Of Survival 팀 프로젝트 3 (0) | 2025.03.14 |
---|---|
35일차 - Path Of Survival 팀 프로젝트 2 (0) | 2025.03.13 |
33일차 - 직렬화, 역직렬화 (0) | 2025.03.11 |
32일차 - 3D Practice 3 (아이템 코루틴, 레이저 트랩) (0) | 2025.03.10 |
31일차 - 3D Practice 2 (아이템, 점프대, 한글 깨짐 현상) (1) | 2025.03.07 |