Unity 검색

머티리얼 배리언트: 복잡한 머티리얼 라이브러리를 관리하는 솔루션

Different color Unity logo spheres on a shelf
Different color Unity logo spheres on a shelf
다루는 주제
공유

머티리얼 하나에 적용된 변경 사항을 다른 여러 머티리얼에 자동으로 적용하는 기능이 필요하셨나요? 아니면 기본 머티리얼을 재사용하여 로컬에서 미세 조정하는 기능은 어떤가요? Unity 2022.1에서는 에디터에서 머티리얼 배리언트(Material Variants)를 관리할 수 있게 되었습니다. 이는 프리팹과 유사한 개념으로 모든 렌더 파이프라인과 호환됩니다.

머티리얼 배리언트를 위한 준비

여러 머티리얼을 동시에 관리하는 팀이나 개인 크리에이터를 위해 만들어진 머티리얼 배리언트를 활용하면 머티리얼을 재사용할 수 있게 되어 협업 과정을 개선할 수 있습니다. 또한 작업 반복 속도가 증가하며, 원활한 업데이트와 오류 감소로 에셋 라이브러리를 향상할 수 있습니다. 많은 개발자들이 필요로 하는 이 솔루션을 활용하면, 표면 프로퍼티 대부분을 공유하는 머티리얼을 재사용하고 세밀하게 관리할 수 있습니다.

Material Variants hierarchy settings in Unity
머티리얼 배리언트 계층 구조 살펴보기

머티리얼 배리언트를 사용하면 일반 머티리얼을 기반으로 하는 템플릿이나 머티리얼 프리팹을 만들 수 있습니다. 이를 통해 템플릿 머티리얼과 같은 프로퍼티는 공유하고 템플릿과 다른 프로퍼티는 오버라이드하는 배리언트가 만들어집니다.

Smoothness Override in a child material
자식 머티리얼의 평활도 오버라이드

템플릿 머티리얼에서 오버라이드하지 않은 공통 프로퍼티를 변경하면 배리언트 머티리얼에 자동으로 반영됩니다. 머티리얼의 특정 프로퍼티가 배리언트에서 오버라이드되지 않도록 잠그는 것도 가능합니다.

Lock the material’s properties to prevent them from being overridden in the variants.
머티리얼의 프로퍼티가 배리언트에서 오버라이드되지 않도록 잠금

한 예시로 프로젝트에서 목재(Wood) 머티리얼의 배리에이션 계층 구조를 다음과 같이 설정할 수 있습니다.

Wood

  • Oak: Wood와 텍스처는 다르나 평활도/메탈릭 프로퍼티는 같음
    • White Oak: 오크 머티리얼과 같으나 기본 컬러 틴트가 다름
    • Red Oak: 오크 머티리얼과 같으나 기본 컬러 틴트가 다름
  • Cherry: Wood와 텍스처는 다르나 평활도/메탈릭 프로퍼티는 같음

Wood머티리얼의 평활도/메탈릭 프로퍼티를 변경하면 계층 구조의 모든 머티리얼에 수정 사항이 자동으로 반영됩니다.

더 빠른 반복 작업을 위한 효율적인 머티리얼 재사용

머티리얼 배리언트의 주요 이점 세 가지는 다음과 같습니다.

  • 향상된 재사용성: 프로젝트 전반에서 공유하는 기본 머티리얼 라이브러리를 효율적으로 빌드한 다음 특정 프로젝트나 씬에서 오버라이드합니다.
  • 안전하고도 빠른 대규모 반복 작업: 많은 머티리얼이 사용되고 여러 아티스트가 함께 작업하는 중간 또는 대규모의 프로젝트에서 머티리얼 배리언트를 사용하면 씬이나 인스턴스별로 미세 조정이 필요할 때마다 모든 머티리얼을 복사해야 하는 어려움을 줄일 수 있습니다. 이제 아티스트는 시각적인 버그를 방지하기 위해 중복된 머티리얼을 추적할 필요가 없습니다. 이는 주로 관련 머티리얼에 변경 사항을 적용하거나 이전 상태로 되돌리는 것을 잊어버리는 경우 또는 성능에 영향을 줄 수 있는 또 다른 셰이더를 사용한 경우 발생합니다.
  • 효율적인 셰이더 그래프 머티리얼: 블랙보드에 설정된 기본값이 모든 자식 배리언트에 자동 전파되는 방식으로 자동 생성된 머티리얼로 배리언트를 만든 경우, 셰이더 그래프에서 기본 머티리얼 프로퍼티를 직접 편집할 수 있으며 블랙보드를 통해 값을 수정할 때 씬에서 실시간 시각화를 활용할 수도 있습니다.

작동 방식

머티리얼 배리언트는 일반 머티리얼 에셋이며, 오버라이드된 파라미터 목록 외에 부모 머티리얼에 대한 레퍼런스도 보관합니다. 에디터 내에서 강력한 성능을 발휘할 수 있도록, 상속된 값은 캐시되며 계층 구조는 머티리얼이 액세스되고 그 부모 중 하나가 가장 최근의 버전 이후 변경된 경우에만 결정됩니다.

프리팹과 달리 머티리얼 배리언트는 계층 구조를 유지하기 위해 에셋 데이터베이스를 사용하지 않습니다. 계층 구조에서 변경 사항이 발생할 때 자식 머티리얼을 내부적으로 다시 임포트할 필요가 없습니다. 메모리에 로드된 자식만 새로 상속된 값으로 업데이트되므로 빠른 반복 작업이 가능합니다.

단, 머티리얼 배리언트 개념은 에디터에서 머티리얼 저작 워크플로를 개선하는 경우에만 활용 가능하다는 점에 주의하세요. 이 개념은 런타임에 영향을 미치지 않으며 전체 런타임 성능의 최적화에도 도움을 주지 않습니다. 사용하는 셰이더만 동일하다면 서로 다른 플랫폼에서 머티리얼 배리언트를 사용해 다양한 머티리얼을 제작할 수 있습니다. 머티리얼 배리언트 계층 구조별로 오직 하나의 셰이더만 사용할 수 있으므로, 지정된 레벨에 특정 셰이더를 설정하여 특정한 플랫폼을 타겟팅할 수는 없습니다. 하지만, 플랫폼을 타겟팅할 때 머티리얼 배리언트를 사용하여 머티리얼 프로퍼티를 편집하거나 특정 키워드를 활성화할 수 있습니다.

스크립트에서 머티리얼 배리언트 사용하기

머티리얼 배리언트는 부모로부터 키워드를 상속하지 않습니다. 키워드 상태가 다른 프로퍼티 값에 좌우되는 경우가 흔하기 때문입니다. 예를 들어, 텍스처가 머티리얼에 할당된 경우에만 키워드가 설정될 수도 있습니다. 이러한 워크플로를 지원하기 위해 ShaderGUI 클래스에 ValidateMaterial이라는 새 API가 추가되었습니다. 이 메서드는 ShaderGUI를 사용하는 머티리얼이 수정될 때마다 또는 머티리얼 배리언트와 관련하여 해당 계층 구조가 결정될 때 호출됩니다. 이렇게 하면 키워드가 최신 상태를 유지하도록 할 수 있습니다.

마지막으로, 머티리얼 인스펙터의 필드에 사용할 커스텀 GUI를 만들고 싶은 경우, 이제 프리팹의 함수와 유사한 BeginPropertyEndProperty라는 함수를 활용할 수 있습니다. 호출 사이에 프로퍼티의 커스텀 GUI 코드를 래핑하면 Unity에 잠금 아이콘이 표시되고 머티리얼 배리언트에 대한 컨텍스트 메뉴가 나타납니다.

시작하기

머티리얼 배리언트를 사용하려면 Unity 2022.1 이상의 버전을 사용해야 합니다.

머티리얼 배리언트는 기존 머티리얼과 호환됩니다. 기존 머티리얼의 배리언트를 만들려면 프로젝트(Project) 창으로 이동하여 Material Asset을 마우스 오른쪽 버튼으로 클릭하고 Create > Material Variant를 선택합니다. 기존 머티리얼을 머티리얼 배리언트로 전환할 수도 있습니다. 중복된 머티리얼을 이미 사용 중이고 해당 머티리얼을 공통된 부모 머티리얼에 다시 연결하여 프로젝트에 새 워크플로를 도입하고자 하는 경우에 유용합니다.

또한 부모 머티리얼의 일부 프로퍼티를 잠가 자식 머티리얼이 이를 수정하는 일을 방지하고(예: 표면 옵션), 부모 머티리얼에 영향을 미치지 않는 자식의 프로퍼티를 수정할 수 있으며(예: 기본 맵 색상), 부모를 수정(예: 새 기본 맵 텍스처)하여 모든 자식 머티리얼에 변경 사항을 적용할 수 있습니다.

언제든지 머티리얼 배리언트 계층 구조를 살펴 모든 레벨에서 적용된 변경 사항의 영향을 확인하거나 올바른 레벨에서 변경 사항을 적용하고 있는지 파악할 수 있습니다. 머티리얼 배리언트는 부모 재지정, 되돌리기, 오버라이드 상향 적용 등 다수의 유용한 기능을 제공합니다. 자세히 알아보려면 여기에서 기술 자료를 읽어 보세요.

향후 계획

현 단계에서는 신규 기능보다는 안정성에 집중하고 있습니다. 피드백이나 질문이 있다면 전용 Unity 포럼 스레드를 활용하시기 바랍니다.

머티리얼 배리언트를 직접 사용해 본 다음 시간을 내어 설문조사를 작성해 주세요. 해당 기능의 초기 품질을 검증하는 데 큰 도움이 됩니다. 새로운 기능을 제안하고 출시 예정인 후보 기능에 투표하려면 여기에서 공개 로드맵을 확인하세요.

다루는 주제
관련 게시물