유니티 개발 시 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의 값을 저장 해둔 원본값으로 다시 바꿔주면 된다
끝!
'Unity' 카테고리의 다른 글
[UNITY, C#] unitywebrequest downloadProgress 값이 일정하게 증가하지 않는 경우 해결 (0) | 2024.02.15 |
---|---|
[Unity] NullReferenceException: SerializedObject of SerializedProperty has been Disposed. 에러 발생 (0) | 2024.01.30 |