유니티(Unity)에서 게임을 개발할 때 가장 기본적인 방식은, 씬(Scene) 안에 게임 오브젝트(GameObject)를 생성하고 여기에 모노비헤이비어(MonoBehaviour) 기반의 스크립트를 부착해서 데이터와 기능을 추가하는 방법입니다.
예를 들어, '탱크'라는 게임 오브젝트가 있다고 가정해 보겠습니다. 이 오브젝트에 MyTank라는 이름의 모노비헤이비어 스크립트를 연결하고, 그 안에서 탱크의 체력이나 속도와 같은 변수를 정의하는 방식이 바로 그것입니다.
이런 방식은 유니티 게임 개발을 배운 분들이라면 누구나 다 기본적으로 사용하고 있을 것입니다. 가장 기본이 되는 유니티 게임 개발 방식이기 때문입니다.
그런데 프로젝트의 규모가 커지고, 동일한 형식의 게임 오브젝트(GameObject) 인스턴스가 수십 개, 수백 개 단위로 늘어나게 되면 이 방식이 가지고 있는 문제점이 드러나기 시작합니다.
예를 들어, 탱크 오브젝트를 프리팹(Prefab)으로 저장한 다음, 씬 안에 이 프리팹의 인스턴스를 300개 생성했다고 가정해 보겠습니다. 이 300개의 탱크가 전부 동일한 데이터를 가지고 있다고 해도, 각각의 탱크 인스턴스들이 가지고 있는 체력이나 속도 데이터는 개별적으로 저장될 것입니다.
따라서 이러한 방식은 동일한 데이터가 메모리에 반복적으로 할당되도록 해서, 결과적으로 전체 메모리 사용량을 불필요하게 증가시킵니다.
이러한 문제를 해결할 수 있는 효과적인 수단이 바로 스크립터블 오브젝트(ScriptableObject)입니다.
스크립터블 오브젝트는 공통 데이터를 별도의 에셋(Asset)으로 정의하고, 여러 게임 오브젝트(GameObject)가 이 에셋을 참조하는 식으로 사용됩니다.
예를 들어, 300개의 탱크가 모두 동일한 설정 값을 가지고 있다면, 이 설정을 하나의 스크립터블 오브젝트에 정의해두고 모든 탱크의 인스턴스들이 이를 공유하도록 할 수 있습니다. 그리고 그 결과, 전체 메모리 사용량을 줄이고, 쉽게 데이터를 관리할 수 있게 됩니다.
메모리 관리 측면에서의 이점만 있는 것은 아닙니다. 스크립터블 오브젝트를 이용하면 데이터와 코드를 분리할 수 있습니다. 그 결과 데이터와 관련된 작업은 게임 디자이너(기획자)나 레벨 디자이너가 담당하고, 코드와 관련된 부분은 프로그래머가 담당하도록 할 수 있습니다. 다시 말해, 게임 개발에 참여하는 모든 직무의 개발자들이 서로의 영역을 침범하지 않으면서도 효과적으로 협업할 수 있게 됩니다. 실제로 현업에서는 이것이 스크립터블 오브젝트를 사용하는 가장 큰 이유이기도 합니다.
이 밖에도 스크립터블 오브젝트를 사용함으로써 얻을 수 있는 이점은 다양합니다. 그런데 이론적인 설명을 통해 추상적으로 접근하기 보다는, 실제로 다양한 예제를 직접 만들어 보면서 스크립터블 오브젝트를 어떻게 사용하는지를 직접 경험해 보는 것이 보다 효과적으로 이러한 이점을 배울 수 있는 방법일 것입니다.
따라서 여기에서는 이론적인 설명은 더 이상 진행하지 않고, 바로 예제를 만들어 보면서 실제로 스크립터블 오브젝트가 유니티 게임 개발에서 어떻게 사용되는지를 배워 보도록 하겠습니다.