안녕하세요. 박민성입니다. ☺️
오늘은 Unity의 FormerlySerializedAs에 대해서 글을 쓰고자 합니다. 🤔
개발 관련해서 찾아보다가 신기한걸 찾게 되어 공부하고 글을 쓰게 되었습니다.
1. 필드 이름을 그냥 바꾼다면?


이렇게 코드를 작성 후에 인스펙터 창에서 hp 값을 500으로 바꿨을때!
Unity는 직렬화된 필드 데이터를 저장하고 나중에 다시 불러와 객체 상태를 복원하게 됩니다.

만약 코드를 이렇게 변수 이름을 hp에서 health로 바꾸게 되면

인스펙터에서 설정한 500이라는 값은 사라지고 다시 100으로 설정되게 됩니다. 😢
Unity의 직렬화된 데이터와 코드의 필드를 연결할 때 필드 이름이 중요하기 때문입니다...
2. FormerlySerializedAs란?
이 문제를 해결하기 위한 Attribute가 있습니다.
[FormerlySerializedAs("")]이라는 어트리뷰트인데여
Unity 공식 설명 또한 직렬화된 값을 잃지 않고 필드 이름을 변경하기 위한 Attribute라고 되어 있습니다.
사용하는 방법은~


이렇게 hp를 500으로 설정했다고 쳤을때~
아이고; 변수명을 health로 바꿔야 하네?? 하면 바로~

어트리뷰트를 적고 문자열에 전에 사용했던 변수명 이름을 넣으면!!!

이렇게 인스펙터 창에서 전 hp 값인 500이 유지가 됩니다~! 😎
Unity가 기존에 "hp" 이름으로 저장되어 있던 값을 새로운 health 필드에 연결할 수 있는 것입니다~!
여기서!!!! 주의할점이 있습니다!!
컴파일링할때 직렬화를 다시 재연결 해주기 때문에
[FormerlySerializedAs("")] 이 어트리뷰트를 쓰고 이름을 바꾸면 컴파일링할때 정상작동을 하지만.
이름을 바꾸고 나서 "아! 맞다 그 어트리뷰트 안 썼네?" 하고 다시 어트리뷰트 쓰고 컴파일링하면 그냥 Unity에서는
"음? 🤔 그런 변수명을 가진 친구는 없었는데?"하고 연결을 안 해줍니다... 😭
3. 이름을 여러 번 변경했다면 어떻게 해야 할까요~?
예를 들어서 hp -> health -> currentHealth 이렇게 2번 변경했다고 하면

이런식으로 전전 이름을 남길 수도 있습니다;;
4. 어디다가 쓸까요??
진짜 FormerlySerializedAs는 사용할 때가 명확하고 많다고 생각이 듭니다.
여러 Agent 프리팹에 있는 HealModule이나 DamageCaster, AgentMover 변수명을 바꿀때!!
아니면 ScriptableObject들 변수명 바꿀때!!!
거의 가독성이나 변수명 의미를 더 명확하게 알려주기 위해서 바꿀때.
코드 리펙토링할 때 많이 사용되는거 같습니다.
한마디로 FormerlySerializedAs는! “코드 리팩터링 과정에서 직렬화 데이터 손실을 막는 기능”이라고 표현할 수 있습니다.
5. Editor 전용 Attribute라는 점
현재 Unity 6 API 문서에서는 FormerlySerializedAsAttribute가 Editor-only Attribute라고 설명하고 있습니다. 플레이어 빌드에 포함할 필요가 없는 리네임·직렬화 마이그레이션용 메타데이터라는 의미입니다.
- 리네임(rename) = 이름 바꾸기
- 직렬화 마이그레이션(serialization migration) = 예전에 저장된 데이터를 새 코드 구조에 맞게 이어주는 것
- 메타데이터(metadata) = 실제 게임 데이터가 아니라 Unity가 그 데이터를 어떻게 처리해야 하는지 알려주는 추가 정보
간단하게 말하면 Update()처럼 런타임 성능을 계속 소모하는 기능이 아니라는 말입니다.
오늘은 Unity의 FormerlySerializedAs에 대해서 알아보았습니다.
진짜로 저에게 유용한 어트리뷰트였던 것 같습니다. 근데 현업이나 막 큰 대규모 프로젝트에서는
이렇게 이름을 바꾸는 경우가 없거나 바꿔도 값 넣어주는 것을 자동화? 되어 있으니 많이 사용을 안 할 수도...? 🤔
있겠다. 라고 생각이 들었습니다.
오늘의 노래 추천은
버즈(Buzz) - Monologue(모놀로그) 라는 노래입니다.
제가 버즈 노래를 참 즐겨들었는데여 겁쟁이라는 노래도 참 좋은 것 같습니다.
이외에도 명곡이 참 많은데... 이 곡을 추천하는 이유는 제가 버즈를 이 노래로 알게 되었기 때문입니다. ㅎㅎ
근데 나에게로 떠나는 여행이나 MyLove 등등 참.. 명곡이 많습니다.. ㅎㅎ
내일은 더욱 알차게 보내고 작성해 보도록 하겠습니다.
봐주셔서 감사합니다. ☺️