Unity/Project

[Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 17일차,

JEE_YA 2025. 4. 30. 00:00

어제 발생했던 오류는 단순하게 내가 UniTask를 설치하지 않아 발생한 오류였다.

다른 방법으로 해결하고 있었으니 안되었던것이었는데... 울상짓고 있었더니 조원분께서 보시고는 그거 UniTask 까세요 라고 얘기해주셔서 열심히 깔았는데 그대로 해결댓다. 해피!

 

그리고 이제 오늘은 맵 및 밤낮 구현이다. 맵은 TileManager에 있던걸 조금 응용하여 바꾸었고 현재는 지형이 한개뿐이지만(그마저도 임시다) 추후에 추가될 때를 위해 리스트로 하여 선택할 수 있게 해주었다.

TimeManager는 밤,낮만 설정해주면 된다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MapManager : Singleton<MapManager>
{
    public Transform BaseMapBlock;     // 베이스 맵을 담을 부모 Transform
    [SerializeField] private List<GameObject> mapPrefabs;  // 맵 프리펩 리스트

    private GameObject selectedMapPrefab; 	// 선택된 맵 프리펩
    private GameObject currentMap;      // 현재 생성된 맵 게임오브젝트의 참조

    private void Start()
    {
        CreateMap();
    }

    // 선택된 프리펩으로 맵 생성
    public void CreateMap()
    {
        // 랜덤 인덱스 생성
        int map = Random.Range(0, mapPrefabs.Count);

        // 랜덤 맵 프리팹 선택
        selectedMapPrefab = mapPrefabs[map];

        // 맵 프리팹 생성 - 중앙 위치에 배치
        currentMap = Instantiate(selectedMapPrefab, Vector3.zero, Quaternion.identity, BaseMapBlock);
    }
}

이렇게 하면 Map 하위에 생성된 오브젝트에 잘 생성된다.

짠~! 이렇게하면 맵도 일단 마무리

 

이제 낮밤 구현이다. 이게 제일 까다로워보였고 실제로도 구상하는데 제일 까다로웠다.

일단 내가 해야하는건 낮이랑 밤이다. 어떤식으로 이렇게 저렇게 바뀐다 이런거 다 필요없고 낮이 존재한다. 낮엔 밝다, 이런거랑 밤이 존재한다, 밤이 어둡다. 정도만 만들면 된다.

 

TimeManager를 작성할때 신경쓴 부분은

- 태양 오브젝트 밝기를 바꿔주는 형식으로 해서 조절하기, 밤 낮이 바뀔땐 자연스럽게 해줄 수 있게 고민해보기

- 그림자를 위해 달은 밤에만 켜주기

 

근데 그냥 어둡고 밝게는 쉬운데 전환될때 좀 자연스럽게 전환시키고 싶었다. 이거때문에 좀 많이 머리가 아픈 상태고 아직까지도 해결하진 못했다..

일단 어둡고 밝아지게는 아래와 같이 작성했다.

public enum TimeState
{
    Day,
    Night
}

public class TimeManager : Singleton<TimeManager>
{
    // 현재 상태
    [SerializeField] private TimeState currentTimeState;

    [Header("Sun")]
    public Light sun;
    //public Color dayLightColor;
    public float dayLightIntensity = 1.0f;

    [Header("Moon")]
    public Light moon;
    public Color nightLightColor = new Color(0.2f, 0.2f, 1f);
    public float nightLightIntensity = 0.3f;

    public float dayAmbientIntensity = 1.0f;
    public float nightAmbientIntensity = 0.4f;
    public float dayReflectionIntensity = 1.0f;
    public float nightReflectionIntensity = 0.4f;
    
    // 낮 전환
    public void SetDay()
    {
        if (currentTimeState != TimeState.Day)
        {
            currentTimeState = TimeState.Day;
        }
        LightSetting();
    }

    // 밤 전환
    public void SetNight()
    {
        if (currentTimeState != TimeState.Night)
        {
            currentTimeState = TimeState.Night;
        }
        LightSetting();
    }
    
    // 밝기 설정 (조명, 태양)
    private void LightSetting()
    {
        // 태양 설정
        if (sun != null)
        {
            // 밤이면 어둡게, 낮이면 밝게
            sun.color = (currentTimeState == TimeState.Day)
                ? new Color(1.0f, 244f / 255f, 214f / 255f)
                : new Color(0.2f, 0.2f, 0.2f);

            // 밝기도 상황에 따라 설정
            sun.intensity = (currentTimeState == TimeState.Day) ? dayLightIntensity : 0.2f;
        }

        //환경 조명 밝기 설정
        RenderSettings.ambientIntensity =
            (currentTimeState == TimeState.Day) ? dayAmbientIntensity : nightAmbientIntensity;

        RenderSettings.reflectionIntensity =
            (currentTimeState == TimeState.Day) ? dayReflectionIntensity : nightReflectionIntensity;
    }
}

SetNight, SetDay는 낮과 밤이 전환될수있게 해줬으며 밝기는 전부 LightSetting을 통해 변경할수있게 해주었다.

근데 처음엔 밤으로 설정했는데 뭔가 이상했다...

아 뭔데.... 왜그러시는건데 이러시는 이유가 있을거 아니에요......

하늘같은 경우 실제 플레이 화면은 보이지 않기에 신경쓰지 않아도 괜찮은데... 근데 맵이 아얘 안보이면 이건 많이 곤란해요..

 

이부분은 밝기 및 광 부분에서 0으로 되어있던 것을 높여주었더니 해결되었다.

그냥 어둡게 어둡게 어둡게만 신경쓰다 보니 모든걸 0으로 해주었더라...

 

그리고 오늘 안에 자연스럽게 바뀌는걸 해보고 싶었는데 코루틴을 사용해서 해보려고 하였으나 아직까지도 완성은 하지 못했다... 이거 너무 어렵다 (ノへ ̄、)