평소 사용은 자주 하였지만 좀 더 자세하게 알아보기 위한 시간을 가지도록 하겠습니다.
- Unity 엔진에서 MonoBehaviour처럼 씬에 붙이지 않고도 데이터 자산으로 관리할 수 있는 클래스입니다.
- 게임 내 공통 설정이나, 다양한 데이터들을 코드가 아닌 에셋 형태로 보관하여 사용할 때 유용합니다.
using UnityEngine;
[CreateAssetMenu(fileName = "NewGameSettings", menuName = "Config/GameSettings")]
public class GameSettings : ScriptableObject
{
public int maxPlayers;
public float spawnInterval;
public Color backgroundColor;
}
- Asset -> Create -> Config -> GameSettings를 통해 에셋을 생성가능합니다.
- 메모리 효율성
- 씬에 붙이지 않으므로 씬 로딩 및 언로드 간 GC 부담이 적습니다.
- 다수의 Monobehaviour 대신 공용 데이터는 ScriptableObject로 분리하여 관리가 가능합니다.
- 재사용성과 버전 관리
- 에셋으로 저장되며 Git 등 버전 관리에 용이합니다.
- 여러 씬 및 프리팹에서 같은 데이터 인스턴스를 참조할 수 있습니다.
- 런타임 데이터 분리
- 데이터와 로직을 철저히 분리시킵니다.
- 개발자가 아닌 비개발자도 손쉽게 추가하거나 수정이 가능합니다.
(개발자가 에디터코드로 사용하기 쉽게 만들어주면 더 좋다.)- 런타임 수정 지원
- 에디터 모드에서 데이터를 변경하면 즉시 갱신합니다.
- 플레이 모드에서도 AssetDATABASE 없이 읽어올 수 있어 편리합니다.
- 게임 밸런스
- 레벨 데이터
- 대화 스크립트
- 이벤트 데이터 (확률표 ...)
- 상태머신 설정
- Addressables이나 Validation, 이벤트 시스템과 연동하여 사용이 가능합니다.
- 커스텀 에디터를 통해 비개발자도 손쉽게 사용이 가능하도록 만들 수 있습니다.
- PlayMode에서 변경한 값이 에디터에도 적용됩니다.
- 순환 참조로 에디터가 느려집니다.
- so 값이 변하지 않습니다.
- 사용하면서 좋았던 점은 커스텀에디터 코드를 사용하여 인스펙터를 잘 구성하면 비개발자도 손쉽게 사용이 가능하단 점에서 좋았습니다. 그리고 정리가 되어보이고 값을 쉽게 변경가능하다는 점에서 좋았습니다.
하지만 값 변경의 경우에는 프로젝트마다 다르겠지만 저는 문서를 불러와 값을 매칭시키는 형태라 패치 부분에서는 큰 차이점을 못느꼇고 생각보다 구조 짜기가 쉽지 않다는 점이 단점이였던 것 같습니다.