Game Tech Blog

스크립터블 오브젝트 본문

Unity

스크립터블 오브젝트

jonghow 2022. 9. 25. 22:55
반응형

Scriptable Object (SO) ? 

> 스크립터블 오브젝트는 Unity에서 제공. 대량의 데이터를 저장하는데 사용하는 데이터 컨테이너.

> 이득은, 사본값 생성을 방지해서 C++ 포인터나 Ref 처럼 원본을 참조해서 몇개를 생성하던 원본 그 자체를 참조할 수 있다는 메모리 측면에서 엄청난 이득이 있다.

> 변경되지 않는 데이터를 일반 변수로 구현할 경우 인스턴스화 할때마다 프리팹에 대한 사본이 생성된다. 이 때문에 다른 데이터 형식을 사용하면 메모리를 비교적 많이 먹는 이유가 된다.

 

vs MonoBehavior

> SO는 OnEnable, OnDisable, OnDestroy만 콜백으로 받는다

> SO는 AddComponent 함수로 붙일 수 없다

> MonoBehavior를 사용하기 위해서는 Instance화가 필요하다. 이 인스턴스화 때문에 사본이 만들어지고, 개체마다 사용하는 메모리가 많아지는 것, SO는 게임 내 작동하는 인스턴스가 필요없는 독립 실행형 개체(Instance 필요 X)

> SO의 데이터를 변경하고 저장하기 위해서는 SetDirty()로 어셋파일을 Write해야함(미 호출 시 설정 데이터가 초기화)

> 한 곳의 원본 SO 데이터를 변경시에 참조하는 모든 데이터가 변경됌

> 빌드에서 SO 데이터를 변경하고자 해도 변경되지 않음

 

 

사용 방법

-> 집에서 준비. (아직 사용못해봄. 22.09.27)

 

Advantage of Scriptable Object 

> 1. 디버그 하기 쉬움

>> 음.. 이건 잘 모르겠다. 써보면서 느낄 수 있으려나 싶다.

 

> 2. 클린 게임 디자인 구조

 

> 3. 낮은 메모리 소비

>> 가장 중요

 

> 4. 에디터 친화

> 5. 인스턴스 필요 없음

> 6. 에셋으로 저장 가능

> 7. 런타임 중 저장 가능

> 8. 프로토 타이핑에 적합

 

> 9. 모듈식 설계 접근 방식

>> 이건 연결하면 쓰고 아니면 안쓰는거라 컴포넌트식 접근 방식은 맞긴 하겠다.

 

> 10. 독립 데이터 컨테이너

 

> 11. 고도로 사용자 정의 가능한 게임 밸런스

>> 이건 무슨 말인지 모르겠다.

DisAdvantage of Scriptable Object 

> 1. 에디터 외부에서 편집 불허

>> 이게 가장 고민되는 부분이다. 대용량 데이터를 관리하면 엑셀이 편한데, 스크립터블 오브젝트 데이터 까보면서 데이터 바꾸세요 라고하면 데이터 바꿔야하는 기획자가 도망가지 않을까.

 

> 2. JSON처럼 확장성이 높지 않음

> 3. 에디터에서 런타임 후 값이 재설정되지 않음

> 4. 독립 실행형 빌드에서는 값이 저장되지 않음

> 5. 빌드에 포함되어 나가는 데이터라 변조 가능

 

Scriptable Object 활용 방안 구상

> 이득 부분에 나와있듯, 가장 좋은 활용 방안은 프로토 타이핑 단계에 굳이 xml 이나 json 파싱 구조를 안만들고 SO를 이용해서 데이터 파싱쉽게해서 써먹는게 제일 좋지 않을까? 라는 생각이든다.

 

> 다른 방법으로는 음.. 글쎄, 내 게임에서는 타워정보나 몬스터 정보같은 코어 데이터로는 쓰면 안될 것 같긴하다. 

중간중간 보여지는 영상데이터라던가 컷씬 데이터 정도는 이것으로 사용해도 무방하겠지만, 컷씬까지 나올 디테일한 구조를 만들었다면... 사용을 글쎄... 메모리 이득은 있지만 안하는 방법으로 할지도..

 

> 좋은 방법을 찾아보자... 아직은 잘 모르겠다..

Scriptable Object 에 의한 의견

> 솔직히 SO에 관해서 Xml이나 JSON을 대체해서 데이터로 쓰면 좋겠다! 라고 생각하고 이 포스팅을 한거지만, 결과에 다다르면 다다를수록 굳이 이걸 어떻게 잘 활용할 것인가 라는 의문이 계속들어, 어디에 써야할지 모르겠다는 의견이다.

빌드에 같이나가서 언팩하면 데이터 변조도 될 것이고, 사용에 가장 망설이는 부분은 너무 에디터 친화적이라 엑셀같은데서는 수정 못한다는 것.

 

참고

https://www.void1gaming.com/post/scriptable-objects-vs-monobehaviour-a-quick-overlook

https://wergia.tistory.com/189

https://everyday-devup.tistory.com/53

반응형
Comments