C#/게임 제작 + TIL

Material Properties - 마테리얼/쉐이더 속성

Toa_ 2025. 3. 5. 20:20

 

 

 

이번에는 3D기반 프로젝트이다.

해당 프로젝트 에는 유니티에 있는 여러 무료 로우 폴리곤 에셋들을 사용하였다.

3D의 경우 2D기반의 게임보다 더 높은 마테리얼 / 쉐이더의 활용이 요구되는데, 이때 속성값 변환에 사용되는 기본적인 속성 접근법에 대해서 작성해보려 한다.

 


 

일반적으로 다른 클래스의 내부 변수에 접근하려 하면 아래와 같이 직접 변수에 접근하여 변경한다.

public Light myLight;
void Start()
{
    myLight.intensity = 2.0f; // 이렇게 직접 변경해야 함
}

 

 

 

하지만 마테리얼의 경우 아래와 같이 일반적인 유니티 컴포넌트의 접근 방식과는 조금 다르다.

    public Material skyBoxMaterial;
    [Range(0, 1)] public float timeofDay;
    
    void Update()
    {
        skyBoxMaterial.SetFloat("_CubemapTransition", timeofDay);
    }

 

 

 

  • SetFloat(string name, float value)
  • SetInt(string name, int value)
  • SetVector(string name, Vector4 value)
  • SetColor(string name, Color value)
  • SetTexture(string name, Texture value)

위와 같은 Set 메서드를 통해 마테리얼의 속성에 접근하며, 이때 string name에 들어가는 string값은 마테리얼 코드상에 지정된 변수를 string 형식으로 넣어주면 된다.

 


 

 

이를 이용하여 SkyBox의 마테리얼을 시간에 따라 실시간으로 변화하며, 배경 변화에 따른 Cubemap Exposure 값을 선형 보간하여 시간값과 반대로 적용되도록 코드를 작성하였다.

 

public class TimeController : MonoBehaviour
{
    public Material skyBoxMaterial;
    [Range(0, 1)] public float timeofDay;
    public bool upTime = true;// timeofDay가 0에서1로 갈때 true, 1에서 0으로 갈때 false.

    // Update is called once per frame
    void Update()
    {       
        skyBoxMaterial.SetFloat("_CubemapTransition", timeofDay);
        // timeofDay와 쉐이더의 Cubemap Transition 변수를 1대1 비율 연결.
        
        skyBoxMaterial.SetFloat("_Exposure", Mathf.Lerp(1f,0.5f,timeofDay));
        // timeofDay(0 ~ 1) 에 따라 Cubemap Exposure값을 1에서 0.5로 선형 보간.
        
        if(upTime)
        {
            if (timeofDay >= 1)
            {
                upTime = false;
            }
            timeofDay += Time.deltaTime * 0.0034f;// 300초에 12시간 0에서 1로 증가.
        }
        else
        {
            if (timeofDay <= 0)
            {
                upTime = true;
            }
            timeofDay -= Time.deltaTime * 0.0034f;// 300초에 12시간 1에서 0으로 감소.
        }
    }
}

 

 


실제 적용 확인

 

 

적용한 코드가 정상적으로 작동하며, timeofDay 가 0일때 1로, timeofDay 가 1일 때 0.5로 Exposure을 선형 보간해준 부분도 정상적으로 작동하는 모습을 확인할 수 있다.