본문 바로가기
Unity3D/API

ScriptableObject를 저장하는 법: EditorUtility.SetDirty(Object target)

by 니키티스 2021. 3. 17.

유니티 에셋(ScriptableObject, Monobehaviour)을 저장하기

Unity - Scripting API: EditorUtility.SetDirty (unity3d.com)

 

Unity - Scripting API: EditorUtility.SetDirty

You can use SetDirty when you want to modify an object without creating an undo entry, but still ensure the change is registered and not lost. If the object is part of a Scene, the Scene is marked dirty. If the object may be part of a Prefab instance, you

docs.unity3d.com

유니티는 기본적으로 에셋을 변경해도 자동으로 저장되지 않는다.

 

프로젝트를 진행하던 도중 ScriptableObject를 실행 중에 변경했는데 디스크에 자동으로 저장되지 않아 문제가 생겼다.

 

인스펙터에 버튼을 추가하여 ScriptableObject의 값을 변경하도록 했다.

그런데 씬을 껐다가 켜면 값이 모두 초기화되어 있는 것이다.

 

해결 방법을 찾던 도중 SetDirty를 사용하면 이를 해결할 수 있다는 정보를 찾았다.

 

EditorUtility.SetDirty(Object target);

 

SetDirty()는 target object의 더티 플래그를 설정해서 디스크에 저장될 수 있도록 하는 메서드다.

 

여기서 더티 플래그라는 용어가 나오는데 이건 더티 플래그 패턴에서 따온 것이다.

 

간략하게 말하면, 하나하나의 요소가 변경될 때마다 저장하기는 너무 비용이 비싸니, 변경된 요소에 더티 표시를 해놓고 나중에 저장할 때 더티 표시가 있는 것만 저장한다고 보면 되겠다.

 

디자인 패턴 - 더티 플래그(Dirty flag) (hajeonghyeon.blogspot.com)

 

디자인 패턴 - 더티 플래그(Dirty flag)

계속해서 변경되는 ' 기본값 '이 있다. 또한 ' 파생값 '은 기본 값에 비싼 작업을 거쳐야 얻을 수 있다. 더티 플래그는 파생 값이 참조하는 기본 값의 변경 여부를 추적한다. 즉 더티 플래그는 기

hajeonghyeon.blogspot.com

 

유니티는 더티 플래그가 설정된 오브젝트만을 저장한다.

 

여기서 SetDirty는 오브젝트에 더티 플래그를 설정해서 저장할 수 있는데, 씬(Scene)을 실행하는 도중에 ScriptableObject를 변경해도 SetDirty를 사용하면 ScriptableObject도 디스크에 저장하는 것이다.

 

여기서 SetDirty를 지정할 수 있는 것은 ScriptableObject만 있는 것이 아니다.

 

예를 들어 Scene 안에 있는 배 오브젝트의 위치를 저장하고 싶을 수가 있다.

이때 오브젝트에서 SetDirty()를 호출해주게 되면 배, 배의 부모 오브젝트, 그리고 씬까지 dirty 플래그가 활성화되어 저장하게 된다.

 

유니티 스크립팅 API에 의하면, 만약 저장을 했다가 기존 상태로 되돌리는 기능(Undo)도 넣고 싶다면 SetDirty() 대신 Undo.RecordObject를 사용해야 한다.

필요하다면 참고하자.

 

 

참고 자료

Devkorea에 있는 자료로는 이 자료를 참고하면 도움이 될 것이다.

유니티 스크립트 레퍼런스 – EditorUtility.SetDirty (devkorea.co.kr)

 

유니티 스크립트 레퍼런스 – EditorUtility.SetDirty

static function SetDirty (target : Object) : void 설명 dirty 개체로 target을 설정 합니다. 유니티는 변경된 에셋을 찾거나 에셋이 디스크에 저장 되길 원할때 내부적으로 dirty flag를 사용합니다. 만일 당신이

www.devkorea.co.kr

 

'Unity3D > API' 카테고리의 다른 글

deltaTime은 언제 계산될까?  (0) 2023.07.15

댓글