핵심 정리
| 항목 | 내용 |
|---|---|
| 역할 | 장면에 직접광을 추가하고 밝기, 색, 범위, 그림자 방식을 결정 |
| 언제 쓰는가 | 태양광, 실내 조명, 스포트라이트, 연출용 하이라이트, 경고등을 만들 때 |
| 기준 버전 | Unity 6.5 (6000.5) |
| 핵심 Inspector | Type, Color, Intensity, Range, Spot Angle, Shadows, Culling Mask, Cookie |
| 자주 연결되는 API | type, color, intensity, range, spotAngle, shadows, enabled |
Inspector 설정
| 설정값 | 언제 바꾸는가 | 잘못 맞추면 생기는 문제 |
|---|---|---|
| Type | 태양광, 전구, 손전등처럼 광원 종류를 정할 때 | Range, Spot Angle 해석을 잘못 이어서 결과가 완전히 달라짐 |
| Color / Temperature | 분위기, 시간대, 경고등 성격을 줄 때 | Intensity만 올려 씬 전체가 씻기거나 과포화됨 |
| Intensity | 기본 밝기를 맞출 때 | 포스트 프로세싱과 겹쳐 과도하게 밝아짐 |
| Range | Point/Spot이 실제 닿아야 할 범위를 줄 때 | 씬 전체로 빛이 새거나 너무 가까워야만 보임 |
| Spot Angle | 손전등, 스테이지 조명 원뿔 범위를 잡을 때 | 지나치게 좁아 안 보이거나, 넓어져 Point처럼 느껴짐 |
| Shadows / Bias | 주 광원 그림자 품질을 잡을 때 | acne와 peter panning 사이에서 흔들림 |
| Culling Mask / Cookie | 특정 레이어만 비추거나 무늬를 줄 때 | 원치 않는 오브젝트까지 비추거나 패턴이 어색함 |
Type, Range, Spot Angle
Directional은 태양처럼 방향만 있고 거리 감쇠가 없는 빛, Point는 전구처럼 사방으로 퍼지는 빛, Spot은 손전등처럼 원뿔형 빛입니다. Type을 먼저 고르고 나서야 Range, Spot Angle의 의미가 생깁니다.
Point와 Spot에서 Range를 크게 잡으면 씬 전체에 비용이 퍼집니다. 빛이 닿는 실제 범위만큼만 줄이는 것이 성능과 디버깅 모두에 유리합니다.
| 값 | 언제 고르는가 | 주의할 점 |
|---|---|---|
Type = Directional | 태양광, 달빛, 씬 전체 방향광 | Range 개념이 없어서 Point처럼 튜닝하면 감이 어긋남 |
Type = Point | 전구, 횃불, 램프, 폭발광 | Range를 크게 두면 좁은 실내도 전부 밝아질 수 있음 |
Type = Spot | 손전등, 감시등, 무대 조명 | Spot Angle과 Range를 같이 안 맞추면 광원 모양이 부자연스러움 |
Color, Intensity, Temperature
Color와 Intensity는 광원의 기본 성격입니다. 색온도 사용 여부는 프로젝트 조명 스타일에 따라 다르지만, 실무에서는 "밝기 보정"을 Intensity로만 억지로 해결하기보다 색과 노출의 조합으로 맞추는 편이 결과가 안정적입니다.
Intensity를 무작정 올리면 Bloom, Tone Mapping, 노출과 함께 결과가 과장될 수 있습니다. 씬이 어둡다면 Light 하나만 키우지 말고 포스트 프로세싱과 환경광도 같이 봐야 합니다.
Shadows, Bias, Culling Mask, Cookie
Shadow Type은 그림자 생성 여부와 품질을 좌우합니다. 그림자가 필요한 주인공 광원인지, 분위기용 보조광인지 먼저 구분해야 합니다. Bias와 Normal Bias는 acne와 떠 보이는 그림자 사이에서 조정하는 값입니다.
Culling Mask는 이 광원이 비출 Layer를 정합니다. UI, VFX, 월드 프롭을 분리해서 특정 광원만 받게 만들 때 중요합니다. Cookie는 조명 모양을 텍스처로 제한해 창문 그림자, 네온 패턴, 경고등 무늬를 만들 때 유용합니다.
| 값 | 언제 고르는가 | 주의할 점 |
|---|---|---|
Shadows = None | 보조광, 작은 장식광, 성능이 우선일 때 | 깊이감은 약해질 수 있음 |
Shadows = Hard | 실시간 그림자는 필요하지만 비용을 아끼고 싶을 때 | 경계가 거칠어 보일 수 있음 |
Shadows = Soft | 주 광원, 캐릭터 주변처럼 부드러운 그림자가 필요할 때 | 비용이 더 크고 저사양에서는 부담이 커짐 |
스크립트 연결
| 필드/프로퍼티 | 언제 읽거나 쓰는가 | 주의할 점 |
|---|---|---|
enabled | 경고등, 전원 on/off 상태 | 조명 자체만 꺼지고 오브젝트는 남음 |
color | 경보, 감정 변화, 시간대 연출 | 색만 바꾸면 밝기 체감도 함께 달라짐 |
intensity | 점멸, 숨쉬기 같은 밝기 변화 | HDR/노출이 함께 바뀌는지 확인 |
range | 실시간 반경 조절 | Point/Spot에서만 의미가 큼 |
spotAngle | 스포트라이트 범위 애니메이션 | 매우 큰 값은 의도보다 퍼져 보임 |
shadows | 그림자 on/off 전환 | 성능 영향이 큼 |
| 메서드/연결 방식 | 언제 쓰는가 | 연결 지점 |
|---|---|---|
Update에서 intensity 보간 | 점멸, 펄스, 경보 연출 | 실시간 연출 |
| Animator / Timeline 이벤트 | 컷신과 광원 연출을 동기화할 때 | 애니메이션 이벤트, Timeline |
상태 머신에서 enabled 전환 | 스텔스, 전원 차단, 방 진입 트리거 | 게임 상태 변경 시점 |
런타임에서는 상태 전환, 점멸, 경보 연출에 자주 씁니다.
using UnityEngine;
public class AlarmLight : MonoBehaviour
{
[SerializeField] private Light targetLight;
[SerializeField] private float minIntensity = 0.5f;
[SerializeField] private float maxIntensity = 2.0f;
[SerializeField] private float speed = 4f;
private void Update()
{
float t = (Mathf.Sin(Time.time * speed) + 1f) * 0.5f;
targetLight.intensity = Mathf.Lerp(minIntensity, maxIntensity, t);
}
}Update에서 점멸을 만들고, 씬 전환이나 컷신에서는 enabled, color, intensity를 상태 머신이나 Timeline 이벤트와 연결하는 경우가 많습니다.
자주 틀리는 부분
- Directional/Point/Spot을 바꿨는데 Range나 Spot Angle 해석을 그대로 가져가면 결과가 완전히 달라집니다.
- 보조광에도 그림자를 켜 두면 성능이 급격히 떨어질 수 있습니다.
- Bias를 올려서 줄무늬를 없앴더니 그림자가 뜨는 경우가 많습니다.
- 광원 범위와 Culling Mask를 정리하지 않아 "왜 이 방까지 밝아졌지" 같은 누수가 생깁니다.
관련 컴포넌트
Camera, Particle System, Animator, Shader Graph 기본과 SRP 전제, CPU-bound vs GPU-bound과 렌더링 비용
참고 링크
2 sources