본문 바로가기

Unity/Articles

Unity: FormerlySerializedAs For Shader 셰이더 프로퍼티 이름 변경시 데이터 보존 방법

유니티에서는 FormerlySerializedAs라는 Attribute를 지원합니다.

 

유니티 에디터는 어떤 인스턴스(프리팹, 씬)를 저장할 때, 필드의 이름을 기준으로 데이터를 저장합니다. 만약 어떤 변수의 이름을 수정한다면, 이전에 작업해 두었던 수치 정보를 잃게됩니다. FormerlySerializedAs는 이런 상황으로부터 도움을 줄 수 있습니다. 

 

https://docs.unity3d.com/ScriptReference/Serialization.FormerlySerializedAsAttribute.html

 

Unity - Scripting API: FormerlySerializedAsAttribute

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

간단한 예시로 사용례를 확인하겠습니다.

MyMonster 클래스에 hitpoints라는 변수가 있었고, health라는 이름으로 수정했습니다. 하지만 컴퓨터 파일시스템에 저장된 데이터에는 이전 이름인 hitpoints로 저장되어 있습니다. FormerlaySerializedAs(변수명) attribute를 붙여주면, 아직 초기화 되지 않은 health의 값을 가져올 때, hipoints로 부터 값을 읽어들어옵니다. 

 

본론에 앞서 스크립트용 FormerSerializedAs 사용방식은 확인하였고, 셰이더 프로퍼티는 어떻게 바뀐 수치를 넘겨줄 수 있을까요?

 

스크립트로 자동화하거나, 직접 바꿔주거나, 모두 바꾸기 기능으로 텍스트 파일의 필드명을 전부 바꿔줄 수도 있습니다. 매번 작업하던 중 좀 더 제네릭하게 수치를 옮겨줄만한 도구가 필요하다 생각해 간단한 도구를 개발했습니다.

 

https://github.com/seonghwan-dev/FormerlySerializedAsForShaderLab

 

GitHub - seonghwan-dev/FormerlySerializedAsForShaderLab: [FormerlySerializedAs] attribute for ShaderLab in Unity.

[FormerlySerializedAs] attribute for ShaderLab in Unity. - GitHub - seonghwan-dev/FormerlySerializedAsForShaderLab: [FormerlySerializedAs] attribute for ShaderLab in Unity.

github.com

 

 

이 패키지를 에디터에 설치하면, C# 스크립트에서 FormerlySerializedAs를 사용하던 것 처럼 셰이더에서도 활용할 수 있습니다.

유의할 점은, 붙여준 다음 해당 머티리얼을 로드 및 저장까지 해 주어야 변경사항이 적용됩니다. 이를 자동화하는것은 에디터 반응성에 악영향을 줄 수 있어 기능으로 탑재되지는 않았고, 프로젝트 뷰에서 t:Material 을 검색하여 모든 Material을 찾은 다음, Reimport를 하고 File - Save Project 메뉴를 통해 반영이 가능합니다.

 

유니티 에디터는 yaml 방식 시리얼라이즈를 사용하고 있어 텍스트 에디터로 *.mat 파일을 열어 값이 전달되었음을 직접 확인해 볼 수 있습니다. 

 

기본 기능 구현이 되어 더 이상 추가적인 작업은 하고 있지 않으나, 기능 추가 요청이나 버그 리포트는 Issue탭에 남겨주시면 적극 반영하도록 하겠습니다.