Unity에서 빛 켜기 방법 (Emission + Lights)
요약
본 튜토리얼은 Unity 엔진을 사용하여 조명(Emission)과 포스트 프로세싱 효과를 활용해 빛을 구현하고 제어하는 방법을 다룹니다. Emission 활성화, 재질 속성 블록 사용, 그리고 Bloom 같은 포스트 프로세싱 기법을 통해 현실적인 발광 효과와 분위기를 연출할 수 있습니다.
핵심 포인트
- Emission 기능을 사용하여 오브젝트 자체에서 빛이 나게 할 수 있습니다.
- 재질 속성 블록(Material Property Block)은 효율적으로 Emission을 제어하는 방법입니다.
- Bloom 같은 포스트 프로세싱 효과는 밝은 물체에 하이라이트를 주어 사실감을 높입니다.
- 스포트라이트와 볼륨 설정을 통해 빛의 범위와 분위기를 세밀하게 조정할 수 있습니다.
안녕하세요, Matt입니다. Speed Tutor에 오신 것을 환영합니다. 오늘 이 튜토리얼은 전반적으로 조명을 켜고 끄는 것에 관한 것입니다. 이 라이트부터 저 라이트까지, 우리는 Emission을 활성화하는 것, 포스트 프로세싱 효과를 사용하여 포인트 라이트를 추가하는 것, 재질 속성 블록(material property block)을 사용하여 Emission을 활성화 및 비활성화하는 방법(이는 material 인스턴스를 생성하는 것보다 더 최적화된 방식입니다), 여러 오브젝트에 걸쳐 공유 재질을 한 번에 끄는 방법, 심지어 1인칭 상호작용을 통해 스위치나 램프를 끌 수 있게 하고 이를 다양한 배열의 다른 램프에 사용하는 방법에 대해 다룰 것입니다.
램프 본체와 그 안에 있는 유리 재질 각각에 대한 것이 있습니다. 때로는 가지고 있을 수 있는 모든 유리나 전구에 별도의 재질을 두는 것이 좋습니다. 하지만 기본적으로 해야 할 일은 완전히 새로운 재질을 만드는 것입니다. 저는 이것의 이름을 'light bulb'이라고 지을 것입니다. 오른쪽 핸드 사이드의 인스펙터(inspector)에는 universal render pipeline lit 셰이더가 있을 것입니다. Emission까지 내려갈 수 있습니다. 여기에 어떤 맵도 추가할 필요는 없습니다. 그리고 Emission을 활성화할 것입니다. 색상을 클릭하고 이것을 흰색으로 설정할 것입니다.
그리고 제가 할 수 있는 것은 이 light bulb 재질을 여기 오브젝트에 설정하는 것입니다. 이미 불이 켜진 것을 볼 수 있습니다. 만약 Emission을 비활성화하면, 마치 빛이 더 이상 켜져 있지 않은 것처럼 보입니다. 따라서 이것과 유사하게 스스로 발광 효과를 추가하고 싶다면, 자신만의 Volume을 추가해야 합니다. 그래서 저는 마우스 오른쪽 버튼을 클릭하여 'Create Empty'로 완전히 새로운 빈 게임 오브젝트(empty game object)를 만들었습니다. 그리고 'Volume'이라는 컴포넌트를 추가했습니다. 따라서 'Add Component'를 클릭하고 'Volume'을 검색한 다음 여기에 추가할 수 있습니다.
이렇게 하면 글로벌 모드를 유지할 수 있습니다. 그리고 기본적인 설정들은 그대로 둘 수 있어요. 이렇게 보이기 시작합니다. 'New'를 클릭하여 완전히 새로운 포스트 프로세싱 프로파일을 추가할 수 있고, 완전히 새로운 오버라이드(override)를 추가하고 포스트 프로세싱으로 이동할 수 있습니다. 여기서 블룸(bloom)이라고 하는 것을 선택할 수 있습니다. 블룸은 밝은 물체에 하이라이트나 빛바랜 영역을 주는 효과입니다. 따라서 임계값(threshold)과 강도(intensity)를 활성화하는 것이 가장 좋습니다. 만약 강도를 높여도 아직 보이지 않습니다.
임계값을 낮추면 윤곽선이 보이기 시작하고, 단순히 강도만 높이면 그곳에서 볼 수 있습니다. 그리고 원한다면 다른 많은 포스트 프로세싱 효과와 결합할 수도 있습니다. 메인 카메라(main camera)에서 포스트 프로세싱이 활성화되어 있는지, 그리고 볼륨(volume)이 메인 카메라의 볼륨 마스크와 같은 레이어에 있는지 확인해야 이 부분이 명확하게 나타납니다. URP에서 포스트 프로세싱 설정과 모든 세부 사항에 대한 전체 비디오가 있으니 아래에도 링크를 남기겠습니다.
장면에 더욱 분위기를 더할 수 있는 한 가지 방법은, 계층 구조(hierarchy)에서 마우스 오른쪽 버튼을 클릭하고 'Light'를 선택한 다음 스포트라이트(spotlight)를 선택하는 것입니다. 그리고 상단 뷰로 가서 이 스포트라이트를 우리가 램프가 있는 주변에 배치할 수 있습니다. 제 라이트 쪽으로 옮겨보겠습니다. 모양(shape)으로 가서 스팟 각도(spot angle)를 조정하면 훨씬 더 크게 만들 수 있습니다. 그리고 강도를 약 5로 높이면, 이미 바닥에 빛이 비치는 모습이 추가된 것을 볼 수 있습니다.
이제 이 기능을 게임 내에서 켜고 끌 수도 있을 것입니다. 그래서 가장 안전한 방법을 보여드리겠습니다. 마우스 오른쪽 버튼을 클릭하고 'Create'를 선택한 다음, 스크립팅(scripting)을 선택하고 모노 비헤이비어 스크립트(mono behavior script)를 선택하여 직접 스크립트를 만들 수 있습니다. 이 이름을 간단히 emission toggle이라고 하겠습니다. 재질을 변경할 때 렌더러(renderer) 중 어느 것을 사용하기보다는 머티리얼 프로퍼티 블록(material property block)을 사용할 것입니다. 이렇게 하면 재질이 중복되거나 인스턴스가 생성되어 메모리를 차지하는 것을 방지할 수 있습니다. 이것이 더 효율적인 방법입니다.
제가 이 스크립트와 모든 리소스를 패트론(patron)에 추가할 예정이니, 필요하시면 가져가실 수 있습니다. 이제 여러 필드를 설정할 것입니다. 여기에는 private renderer, target renderer, 그리고 특정 객체에 여러 재질이 있는 경우를 대비한 material index라는 private integer가 포함됩니다. 예를 들어, 이 메시 렌더러(mesh renderer)는 우리가 접근하고 싶을 수 있는 두 개의 재질을 가지고 있습니다. 여기에 방출(emission) 색상을 켜거나 끌지 여부(보통 검정색 또는 흰색), 그리고 기본적으로 활성화되기를 원하는 경우를 위한 boolean이 있습니다.
몇 가지 새로운 private 필드가 있을 것입니다. 여기에는 셰이더(shader)에서 속성(property)을 ID로 찾는 private static readonly emission ID가 있고, emission color는 셰이더 내의 방출 색상에 대한 단순한 속성 이름입니다. 그리고 머티리얼 프로퍼티 블록(material property block)을 찾고 있는데, 이는 MPB의 약어입니다. 그런 다음 언제 이 기능이 켜져 있는지 꺼져 있는지를 나타내는 boolean을 설정할 것입니다. 마지막으로, target renderer가 채워져 있지 않다고 가정합니다. 즉, 인스펙터(inspector)에 이것을 추가하지 않으면, 이 스크립트가 실제 객체 자체에 있다는 것을 가정하고, 렌더러와 MPB는 우리가 만들고 싶은 새로운 머티리얼 프로퍼티 블록과 같게 설정할 수 있습니다.
시작 메서드(start method)를 만들어서 단순히 Emission 값을 설정하도록 할 수 있습니다. 이 경우 시작은 켜짐(on) 상태가 될 것입니다. 그리고 우리가 할 수 있는 것은 public 토글을 만드는 것입니다. 이것은 빛을 켜고 끄는 것을 토글하고 싶을 때 사용할 수 있는 기능입니다. 따라서 동일한 메서드를 호출할 수 있으며, 이 경우 Emission 값을 설정하게 되고, 언제 켜져 있는지 꺼져 있는지를 지정할 수 있습니다. 그래서 먼저 public void setEmission이라는 public 메서드를 가지고 boolean 타입의 매개변수(parameter)를 하나 가질 것입니다. 그리고 이것을 호출하면 isOn이 on과 같은지 여부를 말하게 됩니다.
따라서 토글에 기반하여 켜짐 또는 꺼짐 상태를 설정할 것입니다. 그다음 우리가 할 것은 대상(target)의 renderer에서 get property block(위에서 설정한 것)을 가져오는 것이고, material index가 무엇인지, 이 경우 zero인지 one인지를 살펴볼 것입니다. 그래서 대부분의 경우 이 예제에서는 array의 element 하나이기 때문에 one일 것입니다. 또는 mesh renderer에 대해서입니다. 그다음, 이미 찾은 Emission ID를 기반으로 material property block set color를 설정할 것입니다.
그리고 켜져 있는지 여부, 즉 물음표(?)가 붙은 Emission 값이 켜져 있는지 꺼져 있는지를 말합니다. 그리고 마지막으로, 사용한 material index와 함께 이 material을 renderer에 다시 전달할 것입니다. 이제 start와 토글을 활성화하도록 하겠습니다. 이것이 단순히 켜고 끄는 것을 토글하는 기능입니다. 자, 이번 경우로 돌아가서 가로등(street light)에 이것을 추가하면, 여기 있는 재질(material)이 두 개라는 것을 볼 수 있습니다. 메인 가로등 재질 하나와 전구용 재질 하나입니다.
재질(material) 인덱스를 1로 설정하겠습니다. 보시면 발광(emission)은 흰색이고 꺼짐 상태는 검은색인 것을 알 수 있습니다. 이제 스크립트는 'Start On'이 활성화되었는지 여부와 관계없이 기본적으로 발광 값이 활성화되었다고 가정합니다. 따라서 지금부터 게임을 플레이해 보겠습니다. Start On이 활성화되지 않았습니다. 그래서 게임이 시작되자마자 꺼졌습니다. 만약 이것을 주기적으로 변경하고 싶다면, 이 'toggle' 메서드를 실행하는 간단한 입력 라인이 있습니다. 그리고 보시다시피 이 발광 값을 켜고 끌 수 있습니다. 그리고 씬 뷰(scene view)에서는 아무것도 변하지 않습니다. 왜냐하면 특정 객체에 대한 재질 렌더링만 변경하고 있기 때문입니다.
따라서 원한다면 개별적인 라이트들을 쉽게 켜고 끌 수 있습니다. 예를 들어, 완전히 동일한 두 개의 객체를 가지고 있고 이들은 같은 재질을 공유합니다. 왼쪽의 아이템에만 발광을 제어하는 스크립트가 있습니다. 보시다시피, 이 게임 오브젝트와 완전히 동일한 재질을 공유하는 것을 영향을 주지 않으면서 이것을 켜고 끌 수 있습니다. 이제 모든 재질을 공유하는 모든 에셋의 발광을 조정하고 싶다고 가정해 보겠습니다. 우리는 재질 속성 블록(material property block)으로 이렇게 하지 않습니다.
우리는 완전히 새로운 스크립트가 필요합니다. 그리고 저는 이것을 'shared material toggle'라고 이름 지었습니다. 이 경우, 변경할 재질을 찾기 위해 재질에 대한 필드가 있습니다. Start On은 여전히 작동합니다. 하지만 이번에는 켜고 끌 수 있는 발광 키워드(emission keyword)인 private string이 필요합니다. 우리는 여전히 'set is on'을 가지고 있고, 시작 시점에 수행하고 싶은 'start of'가 있습니다. 그리고 T로 토글하기 위한 간단한 업데이트 메서드만 있으면 됩니다. 그러다가 토글하고 싶으면, 이것을 켜고 끌 것입니다.
저희 경우 여기 아래에서, 만약 켜져 있다면 타겟 머티리얼을 설정할 것입니다. 발광(emission) 키워드를 사용하여 켜는 방식입니다. 그러면 발광 값이 활성화됩니다. 그리고 다른 모든 경우에는 그 발광에 대한 키워드를 비활성화하여 해당 기능을 끌 것입니다. 이제 제가 스크립트를 추가한 완전히 새로운 게임 오브젝트를 가지고 있고, 타겟 머티리얼은 이 두 특정 아이템에서 공유되는 전구 머티리얼입니다. 저희가 기대하는 것은 이 스크립트를 실행하면 발광이 비활성화될 것이라는 점입니다.
기억하세요. 색상을 설정하지 않았기 때문에 항상 이전에 사용된 색상을 사용할 것입니다. 따라서 아무것도 변경되지 않습니다. 만약 색상을 설정하고 싶다고 한다면, 그것은 스크립트에서 해야 합니다. 이제 게임에 있을 때, 저희가 그 두 머티리얼 전반에 걸쳐 켜고 끌 수 있다는 것을 알아차릴 수 있습니다. 이제 라이트 모드 머티리얼을 선택하면, 제 토글에 따라 발광이 활성화되고 비활성화되는 것을 여기서 볼 수 있습니다. 하지만 게임에 있고 이 공유된 머티리얼로 비활성화하는 경우를 염두에 두세요.
전구 머티리얼이 비활성화된다는 점을 기억해야 하지만, 다시 사용하고 싶다면 어떤 경우에도 그것을 다시 활성화해야 한다는 것을 확인해야 합니다. 스크립트에서 사용한 키워드가 실제로 이 인스펙터 값을 변경하지 않는다는 것을 기억하세요. 이것은 단지 발광 여부입니다. 따라서 이 특정 머티리얼에서는 켜고 꺼지는 것이 아니라, 그냥 활성화되어 있어야 합니다. 그러니 그것을 염두에 두세요. 그래서 이번 튜토리얼의 다음 부분은 저희가 배운 머티리얼 프로퍼티 블록(material property block)과 모든 것을 결합하여 램프나 켜고 끌 수 있도록 설정하고 싶은 다른 오브젝트, 발광(emission), 포인트 라이트 또는 이와 유사한 것에 적용하는 방법을 살펴보는 것입니다.
게임을 돌아다니면서 원하는 만큼 많은 상호 작용을 만들 수 있습니다. 자, 시작하기 위해 여기 램프 갓(lamp shade)이 있는데, 이것이 부모 게임 오브젝트이며 박스 콜라이더가 필요합니다. 지금은 모든 기즈모를 비활성화했습니다. 이 장면에서는 조금 복잡해서요. 여기 램프 갓을 볼 수 있고, 제가 이것을 비활성화하면 갓 오브젝트(shade object)를 볼 수 있습니다. 이 오브젝트는 Emission 속성이 있는 머티리얼을 가지고 있는데, 우리는 이것을 비활성화할 것이고, 환경에 대한 빛 역할을 하는 포인트 라이트(point light)도 안에 있습니다.
테스트용으로 FPS 컨트롤러도 가지고 있습니다. 이전 영상의 부분에서 만들었던 것과 유사한 스크립트를 생성하는 것으로 시작하겠습니다. 머티리얼 속성 블록을 편집할 것입니다. 오른쪽 클릭 후 'Create'를 선택하고, 'Scripting'을 고른 다음 'MonoBehaviour Script'를 선택합니다. 저는 이것을 simple lamp toggle라고 이름 지을 것입니다. 열리면 렌더러(renderer) 필드, 여러 개가 있을 경우의 머티리얼 인덱스(material index), 켜짐/꺼짐 색상 필드가 여전히 있습니다. 새로 추가된 것은 라이트(light)입니다. 이것은 전체 게임 오브젝트를 비활성화하고 싶을 때일 수도 있고, 단순히 라이트만 할 수도 있습니다.
저는 이것을 attached light라고 이름 지었습니다. is on에 대한 부울(boolean) 값도 여전히 가지고 있습니다. emission ID에 대한 정수(integer) 값이 있고, MPB라는 머티리얼 속성 블록 필드와, 켜짐/꺼짐 상태를 나타내는 부울 값이 있습니다. 여기에 있는 awake 메서드에서는 material property block을 우리가 만들 것이기 때문에 새로운 material property block과 같게 설정합니다. 이를 위해 start와 public toggle이라는 두 개의 메서드를 가지고 있습니다. 시작 시에 켜져야 하는지(is on) 상태를 설정할 수 있고, 언제든지 is on의 반대 상태로 설정하여 켜고 끌 수 있습니다.
이제 public 메서드인 set state가 있습니다. 필요하면 이 메서드를 접근할 수 있습니다. 이 메서드는 모든 것에 대한 매개변수를 가지고 있으며, 우리가 할 일은 is on을 다른 메서드들에서 전달받은 값으로 설정하는 것입니다. 만약 타겟 렌더러(target renderer)를 가지고 있다면, 우리는 머티리얼 프로퍼티 블록(material property block)을 가져올 것이고, ID에 기반하여 색상을 설정한 다음, 이를 다시 타겟 렌더러에 설정할 것입니다. 그리고 연결된 라이트(attached light)가 있다면, attach light.enabled를 on으로 설정합니다. 따라서 이는 우리가 이미 선택한 것에 따라 on 또는 off와 같습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 YouTube SpeedTutor (Unity)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기