게임 개발 공부 기록

34일차 - Path Of Survival 팀 프로젝트 1

00lwt 2025. 3. 12. 21:34

▶▷ 프로젝트 계획

와이어 프레임

아포칼립스 상황에서 좀비에게 감염되어 기존의 베이스 캠프에서 쫓겨난 플레이어가 치료를 받기 위해 다른 베이스 캠프를 찾아 생존하며 이동하는 컨셉의 프로젝트이다.

나무와 돌 등의 자원들을 채집하여 인벤토리에 보관 및 각종 아이템을 제작할 수 있다. 또한 음식과 물을 얻어 갈증과 허기를 회복할 수 있으며 장비를 장착하여 좀비와 전투를 할 수 있다.

 

▶▷ 밤/낮 사이클

생존 게임에서 필요한 요소인 낮과 밤을 구현하기 위해 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. 아직 하지 못함 (추후 수정)