[Basic] 라이트



광원 효과를 줄 수 있는 라이트 컴포넌트에 대해 알아보자.

Type

라이트 컴포넌트의 Type에는 4가지가 있다.

Directional

Directional은 태양과 같은 효과이다. 태양과 같은거라고 보면 된다. 게임 전체에 동일한 빛을 쏜다.

Spot

Spot는 스포트라이트처럼 빛이 한군데에 집중된다.

Point

Point는 일반 전구라고 생각하면 된다, 오브젝트 주변으로 빛이 동그랗게 퍼져 나간다.

Area(Bake Only)

Area는 Bake전용이다. Tv라고 생각하면 된다. 직사각형모양의 텍스쳐에서 빛이 나온다.

Color

말 그대로 조명의 색을 바꾼다.

Mode

Mode에는 3가지 종류가 있다.

RealTime

RealTime은 매 프레임마다 광원을 계산해서 어디에 그림자를 뿌리고 위치마다 밝기를 조절해준다. 그래서 과부화가 올 수 있어서 최적화를 할 때는 가급적 사용하지 않는다. 최적화를 위해서 나온게 Baked이다.

Baked

Baked는 최초 1회 한 번 구워서 계산하고 그 뒤로는 처음 계산한 그대로 계속해서 보여주는 것이다. 그래서 계속해서 움직이는 오브젝트가 있다고 한다면 그 오브젝트의 그림자와 오브젝트는 따로 움직이게 될 것이다. 그래서 Baked는 한 번 고정된 배경같은 곳에 많이 쓰인다.

Mixed

Mixed는 Realtime과 Baked가 섞인 것이다.

Intensity

빛의 세기를 정한다.값이 커지면 빛의 강도가 세진다.

Indirect Multiplier

Indirect Multiplier는 간접광인데 다른 오브젝트의 빛이 반사되어 들어는 빛의 정도를 다룬다. 값이 커지면 영향을 더 많이 받는다.

Shadow Type

그림자 타입을 결정한다.

strength

그림자의 세기를 결정한다. 1에 가까울수록 진하게 그려진다.

Resolution

그림자의 퀄리티를 결정한다.

Cookie

빛을 방해 할 놈의 모양을 텍스쳐로 넣는다. 예를들어 하늘의 구름을 표현하고 싶다면 구름 오브젝트를 만드는게 아니라 쿠키에 구름모양 텍스쳐를 넣으면 된다.

이 정도면 나머지 프로퍼티는 쉽게 이해할 수 있을 것이다.

깜빡거리는 전구 만들기

우선 라이트 오브젝트의 타입을 Point로 바꿔서 전구로 활용하게 만든다. 그 다음 아래와 같은 스크립트를 컴포넌트에 추가해주면 깜빡거리게 된다.

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

public class Test : MonoBehaviour
{
    [SerializeField]
    private Light light; //깜박거리게 할 라이트 오브젝트

    float curIntensity;//현재 빛의 세기
    float targetIntensity;//목표 빛의 세기
    void Start()
    {
        curIntensity = light.intensity;//현재 빛의 세기
        targetIntensity = Random.Range(0.4f, 1.0f); //목표 빛의 세기를 랜덤으로 정함
    }
    void Update()
    {
        //현재 세기와 목표세기가 같지 않다면 float끼리 빼기 때문에 오차가 있을 수 있어서 이렇게 표현
        if ( Mathf.Abs(targetIntensity-curIntensity)>=0.01 ) 
        {
            if(targetIntensity > curIntensity)
            {
                curIntensity+=Time.deltaTime*3.0f;
            }
            else
            {
                curIntensity -= Time.deltaTime * 3.0f;
            }
            light.intensity=curIntensity;
            light.range = curIntensity + 10;
        }
        else
        {
            targetIntensity = Random.Range(0.4f, 1.0f);
        }
    }
}

코드가 어렵지 않으니 설명을 필요 없을 것이다. 하지만 처음 if문에서 계속해서 변하는 float값 끼리 빼기를 하기 때문에 != 을 사용하지 못해서 오차 범위를 0.01로 잡아서 계산한다.




© 2022. by KSC

Powered by sora