Game Tech Blog
스크립터블 오브젝트 본문
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
'Unity' 카테고리의 다른 글
Unity - Interactive UI 반응형,다이나믹아일랜드 0 | 2023.04.04 |
---|---|
강제로 레이아웃 업데이트, LayoutRebuilder.ForceRebuildLayoutImmediate 0 | 2023.03.21 |
Unity PostProcessing - 그레인 효과 0 | 2022.04.22 |
Unity - 오브젝트 한번에 넣기 0 | 2022.04.19 |
Unity - 프로젝트 파일 .sln 파일 없을 경우 해결 방법 0 | 2022.03.05 |