유니티 입문주차 강의 부터 Scriptable Object를 사용했으나 대충 데이터를 관리하는 기능이겠거니만 생각하고 넘어갔었다. 이번에 팀프로젝트에서 Scriptable Object를 만드는 역할도 맡았다 보니 Scriptable Object에 대해 한 번 정리하고 넘어가는게 좋을 것 같아서 내용을 정리한다.
Scriptable Object는 유니티에서 게임 데이터를 관리하고 저장하는데 사용되는 객체로 MonoBehaviour와 다르게 Scriptable Object는 씬에 첨부되지 않고 에셋 파일로 저장될 수 있다. Scriptable Object를 사용하면 중앙 집중식 관리, 재사용 및 유지보수에 용이하다는 장점을 가지고 있다.
using UnityEngine;
public enum ItemType
{
Equip,
Consum,
Resourece
}
public enum ConsumType
{
Health,
Hunger,
Stamina,
Frozen
}
// CreateAssetMenu를 사용하면 유니티 인스펙터에서 빠르게 만들어 줄 수 있다.
[CreateAssetMenu(fileName = "Item", menuName = " New Item")]
public class ItemData : ScriptableObject
{
// 정보 확인에 용이하게 하기 위해 Header와 public을 사용한다
[Header("Info")]
public string itemName;
public string description;
public ItemType type;
public Sprite icon;
public GameObject dropPrefab;
[Header("Stacking")]
public bool canStack;
public int maxStackAmount;
[Header("Consum")]
public ConsumType[] consum;
[Header("Equip")]
public GameObject equipPrefab;
}
이렇게 만들어진 스크립트를 이용하면 유니티 상에서 에셋을 생성할 수 있다.
이런 식으로 프로젝트 창에서 에셋의 생성이 가능하다.
넣어줄 데이터들은 인스펙터 창에서 확인이 가능하며 여기서 원하는 값들을 넣어줄 수 있다. 이렇게 Scriptable Object를 사용하면 따로 오브젝트에 대한 데이터를 넣기 위해 스크립트를 작성할 필요가 없으며, 공통된 데이터들을 사용한다면 Scriptable Object를 이용해 하나의 에셋을 계속 활용할 수 있고 다른 데이터를 사용한다면 새로운 에셋을 만들어 반영해주면 된다.
사실 처음에는 Scriptable Object를 사용하는 이유가 와닿지 않았는데 이번에 정리를 하니 스크립트로 관리하는거 보다 사용이 쉽고 관리가 편해 보인다. 아직 취업 못한 내가 말하기엔 이상하지만 비 개발자들도 이것을 보며 수정이 쉽겠다고 생각했다. 오브젝트가 가진 데이터들을 스크립트로 관리하는 것 보다 데이터들을 만들 일이 생기면 Scriptable Object를 활용할 수 있는 방안을 고려하는게 좋겠다.