기타/Unity

빛으로 비출 때 보이는 오브젝트

푸쿠이 2022. 6. 23. 10:17

기본적으로는 보이지 않다가,

손전등 오브젝트 (Spot Light)로 비추면 보이는 오브젝트가 필요했다.

 

처음에는 라이트에 스텐실을 짬뽕해서 써야하나 싶었는데, 구글에 검색해보니 원하는 게 있어서 따라해보았다.

 

참고 사이트

https://www.youtube.com/watch?v=9B4hrQPRqtw 

 

프로토타입으로 구현은 해봤는데, 빛의 밝기나 손전등의 거리는 계산하지 않았다.

벡터로 각도만 계산했다.

 

보여질 오브젝트

인스펙터에서 스팟 라이트를 연결해준다.

쉐이더도 생성해서 머터리얼을 연결해준다.

 

RevealObject 스크립트

using UnityEngine;

[ExecuteAlways] // 에디터 모드에서도 실행되어 테스트가 쉽다.
public class RevealObject : MonoBehaviour
{
    [SerializeField] Light spotLight;

    private Material m_Mat;

    private void Start()
    {
        m_Mat = GetComponent<Renderer>().sharedMaterial;
    }

    private void Update()
    {
        m_Mat.SetVector("_MyLightPosition", spotLight.transform.position);
        m_Mat.SetVector("_MyLightDirection", -spotLight.transform.forward);
    }
}

 

Reveal 쉐이더

 

결과

거리, 밝기, 범위는 신경 안쓰고, 오직 각도에만 반응한다.
빛의 크기에 맞게 프로퍼티를 수동으로 맞춰주었다.

제대로 하려면 수식이 많이 복잡해질 것 같다.