오늘 팀프로젝트를 무사히 마무리하고 팀원들과 각자 코드를 어떻게 구현했는지 공유하는 시간을 가지고 있었다.
그때 팀원 한분이 내 코드를 보고 Prefab관리를 ScriptableObject로 하면 관리가 굉장히 수월하고 효율도 좋다해서
코드 리뷰가 끝나자마자 이 기능에 대해 알아보았다.
1. ScriptableObject란?
클래스 인스턴스와는 별도로 대용량의 데이터를 관리할 수 있는 데이터 컨테이너다.
데이터를 저장하는 Prefab이 있는 경우 유용하다. 그 이유는 Prefab을 인스턴스화 할때마다
해당 데이터의 자체 사본이 생성되기 때문이다.
여기서 자체 사본이 생성되기 때문에 메모리 효율도 좋고 유용하다고 나온다.
그럼 자체 사본이 생성된다는게 무슨 말일까?
2. 내 코드와 ScriptableObject코드 성능 비교
나의 코드
이 코드는 내가 Prefab을 관리하기 위해 선언해놓은 부분이다. 우선 배열로 선언해놓고 여러개의 몬스터 데이터를
GameManager로 받아서 몬스터를 소환하는 형식으로 제작했다. 이럴 경우에 메모리 현황은 다음과 같다.
크기가 8byte인 Stage2Monster란 이름의 Prefab이 1000번 실행된다고 가정하자.
그러면 중복된 데이터로 인하여 8byte * 1000의 메모리가 사용된다.
ScriptableObject를 사용한 코드
우선 간단하게 설명하자면 ScriptableObject 를 상속받는 Monster클래스는 Monsters 클래스를 리스트화 해서 데이터를 받고 있다.
이럴 경우 여기에서도 8byte의 Stage2Monster란 Prefab이 1000번 실행된다고 가정하자.
그러면 앞에서 말했듯이 데이터를 "자체 사본" 으로 만들기 때문에 중복된 데이터는 발생하지 않는다.
그러면? 1000번 실행을 해도 여전히 8byte의 메모리만 사용하고 있는 것이다.
3. 사용법
2번 항목의 코드를 보면
[CreateAssetMenu]라고 적혀있다. 이것이 ScriptableObject를 만들기 위해 영어 뜻 그대로 에셋 메뉴에 항목을 만드는 것이다. Monster1으로 만들었기 때문에 아래처럼 Monster1 항목이 뜨는 것을 볼 수 있다.
이제 버튼 누르게 되면 아래와 같이 List를 추가하여 데이터를 넣어줄 수 있다.
Prefab을 적용하여 관리할 수 있고 공격력, 스피드와 같은 스텟류 값도 손쉽게 설정할 수 있다.
나머지는 본인이 설정한 ScriptableObject를 사용하고 싶은 곳에 적용하면된다.
위에는 ScriptableObject의 cs를 Monster1이란 이름의 클래스로 작성했기 때문에 Monster1 사용하고싶은 이름; 으로 선언한다.
오늘은 ScriptableObject에 대해 알아봤는데 작은 소규모 프로젝트에서는 필요성을 못느꼈지만 수많은 스크립트와 Prefab이 난무하는 곳에서는 정말 이 기능이 많이 쓰일 것 같다. 하지만 너무 많은 데이터는 엑셀로 관리한다던데 ScriptableObject의 개념을 보면 "대용량 데이터" 관리라고 나와있다. 이 부분에 관해서는 더욱 경험을 쌓아서 알아가야 할 부분인 것 같다.
'TIL > Unity' 카테고리의 다른 글
[Unity] 직렬화 (0) | 2023.09.18 |
---|---|
Unity 지연함수 Invoke, Coroutine 의 차이점 (0) | 2023.09.15 |
Unity 물체 감지 기능(LayerMask, RaycastHit) (0) | 2023.09.13 |
[Unity] 충돌체크 기능 OnCollision, OnTrigger (0) | 2023.09.12 |
Unity deltaTime (0) | 2023.09.11 |