본문 바로가기
Unity

[Unity] Play mode에서만 material 색상 바꾸는법

by 아마도개발자 2024. 1. 30.

 

유니티 개발 시 play mode에서 gameObject에 적용된 material color를 바꾸면 일반적으로 생각하는 것과 다르게 변경된 값이 play mode를 끄더라도 material에 적용된다. ( Editor에서 적용, 빌드 실행 시 적용되지 않음) 이 때문에 나도 모르게 material의 color가 바뀌어있어 당황한 적이 있는데, 이를 해결하기 위한 방법이 있다.

 

 

아래 예제는 slider로 material color의 알파 값을 바꾸는 코드이다.

 

public class TransparencyManager : MonoBehaviour
{

    [SerializeField] private Slider slider = default;
    [SerializeField] private Material material = default;

    private Color originalColor;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void OnValueChangedSlider(float value)
    {

        var tempColor = material.color;
        tempColor.a = value;
        material.color = tempColor;
    }


}

 

 

이대로 에디터를 play하여 슬라이더 값을 조정하면, 최종 slider의 값으로 material의 알파 값이 변하게 된다.

 

이를 막기 위해 스크립트에 아래 코드를 추가해준다.

#if UNITY_EDITOR
    private Material lastAssignedMaterial;
    private void Reset() => lastAssignedMaterial = null;

    private void OnDestroy()
    {
        if (material != null) material.color = originalColor;
        if (materialLine != null) materialLine.color = originalLineColor;
    }
    private void OnValidate()
    {
        if (material != null && lastAssignedMaterial != material)
        {
            lastAssignedMaterial = material;
            originalColor = material.color;
            
        }
    }

#endif

 

OnValidate()는 스크립트가 로드되거나 값이 바뀌었을 때 이를 감지하고 호출된다. 이 것을 활용해 원본의 material과 originalColor를 저장해두고, OnDestroy()로 실행이 종료되었을 때 material의 값을 저장 해둔 원본값으로 다시 바꿔주면 된다

 

끝!