스크립터블 오브젝트(ScriptableObject)는 대량의 데이터를 저장할 수 있는 데이터 컨테이너이다. 스크립터블 오브젝트를 사용하면 값의 사본이 생성되는 것을 방지하여 메모리 사용량을 줄일 수 있다.
Monster라는 C# 스크립트를 생성하고 Monobehavior 대신 ScriptableObject를 상속받는다.
public class Monster : ScriptableObject {
}
몬스터 정보를 입력해 줄 변수들을 작성한다.
public enum Race {
Human,
Orc,
Elf
}
public class Monster : ScriptableObject {
public string name;
public int health;
public int level;
public int power;
public Race race;
}
몬스터 정보 에셋을 생성하기 위해 CreateAssetMenu 어트리뷰트를 추가해준다. fileName은 에셋 생성시 기본으로 붙여지는 이름이고, menuName은 에셋 생성 메뉴의 이름, order는 에셋 메뉴의 순서이다.
[CreateAssetMenu(fileName = "New Monster", menuName = "Monster/Create Monster", order = 0)]
public class Monster : ScriptableObject {
public string name;
public int health;
public int level;
public int power;
public Race race;
}
Assets/Create 메뉴에 Monster/Create Monster 메뉴가 생성된 것을 볼 수 있다. Create Monter 메뉴를 클릭하여 Monster 에셋을 생성해준다.
Archer, Magician, Warrior의 세가지 에셋을 생성한 후 각가의 데이터를 입력해준다.
위에서 만든 몬스터 데이터들을 적용시킬 스크립트를 생성한다.
public class MonsterPrefab : MonoBehaviour {
public Monster monster;
public void PrintMonsterStatus() {
print(monster.name);
print(monster.level);
print(monster.health);
print(monster.power);
print(monster.race);
}
}
Hierachy에 Cube를 하나 생성 후 MonsterPrefab 스크립트를 붙여주고 프리팹으로 만든다. 생성되면 바닥으로 떨어지게 하기 위해 Rigidbody를 붙였다.
몬스터들을 생성하기 위해 MonsterCreator 스크립트를 생성한다.
public class MonsterCreator : MonoBehaviour {
[SerializeField]
private List<Monster> mosnters = new List<Monster>();
[SerializeField]
private GameObject monsterPrefab;
public void Start() {
foreach (var monster in mosnters) {
var createdMonster = Instantiate(monsterPrefab).GetComponent<MonsterPrefab>();
createdMonster.gameObject.name = monster.name;
createdMonster.monster = monster;
createdMonster.PrintMonsterStatus();
}
}
}
GameObject를 하나 생성하여 MonsterCreator 스크립트를 붙여준 후 Monsters에 위에서 만든 몬스터 데이터 에셋들을 넣어준다.
생성된 MonsterPrefab들이 바닥으로 떨어지게 하기위해 Plane을 하나 생성해 준 후 플레이를 누르면 Archer, Magician, Warrior 이름의 큐브들이 생성되고 Console 창에 작성한 데이터가 출력되는 것을 확인할 수 있다.