Unity/TIL

Unity 조명(Lighting)

김차루 2024. 5. 27. 20:47
스파르타 내배캠 29일차 TIL
C1조_ 1조라도 안 보이면

 

 

 

게임을 더욱 재밌게 만들려면 어떤게 중요할까?

당연히 기믹이나 스토리 같이 플레이어가 바로 확인할 수 있는 부분이 가장 중요하겠지만 나는 배경의 오브젝트와 색감, 빛 사용을 더 주의 깊게 보는 편이다. 아무리 스토리가 좋거나 기믹이 유닉크 해도 연출에서 오는 큰 감동을 무시할 수 없다. 그래서 예전부터 게임 개발을 할 때 연출적인 요소에 대해서 배워보고 싶었다. 마침 오늘 조명 효과에 관하여 배워서 그것을 정리 해보려고 한다. 

 

 

Lighting

라이트 소스

: 게임 또는 3D 랜더링에 광원을 추가하는데 사용된다. 이것은 특정 위치 또는 방향에서 발생하는 빛을 나타낸다.

 

유형

1. 점 광원(Point Light) : 모든 방향으로 균등하게 빛을 발산하는 광원

- 표면에 닿은 광원의 방향은 광원이 닿은 지점에서 라이트 오브젝트의 중심으로 다시 이어지는 선이다. 가로등 불빛이나 전등, 로컬 광원을 시뮬레이션 하는 데 유용하다.

Unity-point light

2. 방향성 라이트(Directional Light) : 무한히 멀리 위치하여 한 방향으로만 빛을 발산하는 광원

- 게임 세계의 범위 밖에 있는 위치에서 오는 크고 먼 광원을 표현한다. 따라서 사실적인 씬에서 해나 달을 시뮬레이션할 수 있다. 

Unity-directional light

3. 스포트라이트(Spot Light) : 씬의 한 점에 위치하여 원뿔 모양으로 빛을 발산하는 광원

- 스폿 관원은 특정 각도로 제약되므로 조명이 비추는 원뿔 모양의 영역이 발생한다. 이 광원은 스폿 광원 원뿔의 가장자리로 갈수록 약해진다. 손전등, 취조실 라이트, 무대 라이트, 자동차 헤드라이트로 사용이 가능하다.

Unity-spot light

4. 면 광원(Area Light) : 표면 영역 전체에 걸쳐 균등하게 모든 방향으로 빛을 방출, 사각형의 한쪽 면에서만 빛을 방출하는 광원

- 오브젝트를 여러 다양한 방향에서 동시에 비추기 때문에 다른 광원 타입에 비해 셰이딩이 더 부드럽고 섬세하다. 사실적인 가로등이나 플레이어 가까이에 길게 늘어선 불빛을 만들 수 있다. 

Unity-area light

5. 발광 머티리얼(Emissive materials) : 광원처럼 전체 표면 영역에서 빛을 발산한다. 

- 말그대로 발광 역할을 해주기 때문에 발광체(네온사인, 자체 빛을 내는 오브젝트 등)에서 사용된다. 

unity - emissive materials

 

강의에서는 Directional Light를 사용하여 해가 지고 달이 뜨는 연출을 구현했다. 

void UpdateLighting(Light lightSource, Gradient gradient, AnimationCurve intensityCurve)
{
    float intensity = intensityCurve.Evaluate(time);

    lightSource.transform.eulerAngles = (time - (lightSource == sun ? 0.25f : 0.75f)) * noon * 4f; // 각도
    lightSource.color = gradient.Evaluate(time);
    lightSource.intensity = intensity;
    
    GameObject go = lightSource.gameObject;
    if(lightSource.intensity == 0 && go.activeInHierarchy)
    {
        go.SetActive(false);
    }
    else if(lightSource.intensity > 0 && !go.activeInHierarchy)
    {
        go.SetActive(true);
    }
}

 

미리 지정한 시간에 따른 빛의 강도와 그라데이션 색을 받아와 강도와 색을 변화 시키고 directional light의 위치 값을 통해 시간에 따른 회전각에 따라 움직이게 했다. 그리고 빛의 강도가 0이 되면 해당 빛 오브젝트를 끄고 다시 1이 되면 키게 했다.  

intensity(강도)는 AnimationCurve를 이용했고 inspector 창에서 값을 조정했다. 

AnimationCurve

왼쪽 아래에 보이는 것으로 필요한 그래프 값을 받아와서 추가 작업을 하는 형식이었는데 

강의와 다르게 나한테는 위의 그림과 같은 지정 커브가 없어서 핀 포인트를 잡고 수정했다. 

Add Key

이어야 하는 부분에서 우클릭을 하게 되면 위와 같이 Add Key를 생성할 수 있다. 아무런 위치에서 생성한 후에

Edit Key

다시 그 포인트를 우클릭하면 Edit Key 키 수정이 가능하다. 여기서 원하는 시간에 따른 강도 값을 조정 해주면 된다.

 

이런 식으로 빛을 조절하여 사용한다면 3D 공포겜에 나오는 손전등은 물론 다른 빛 연출도 가능할 것 같다. 개인 과제를 할 때도 이렇게 빛 사용을 해보면 좋을 것 같다. 

 

 

마무리하며

강의 양이 많아서 요번에도 개인 과제 시간이 빠듯할 것 같다... 내일 오전 중으로 모든 강의를 듣고 빠르게 개인 과제를 시작해야 할 것 같다. 급하더라도 스크립트 구조를 신경 써서 작업해보고 싶다. 생각했던 것 처럼 공포겜으로 가볼까... 아이디어가 항상 문제다.