[유니티] Scriptable Object 알아보기
게임을 제작하면서 데이터를 저장은 필수불가결입니다. 특히 RPG의 경우라면 많은 아이템이 필요할 겁니다. 이때 스크립트 가능한 오브젝트를 하나의 방법으로 사용할 수 있습니다. 스크립트 가능한 오브젝트는 대량의 데이터를 저장하기 위해 사용되는 데이터 컨테이너입니다.
일반적으로 게임 내에 플레이하며 사용되는 데이터들은 일반적으로 클래스로 구현하게 됩니다. 예를 들어 대량의 몬스터 스폰(뱀파이어 서바이벌)이나 대량의 아이템의 드롭(RPG 게임의 재료 아이템) 등의 경우 복사된 사본만큼 메모리를 소모하게 됩니다. 하지만 스크립트 가능한 오브젝트를 통해 구현을 하게 된 경우 메모리에 스크립트 오브젝트의 원본 데이터를 저장하고 이 데이터를 참조하여 메모리 소모를 줄일 수 있습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "New Card", menuName = "Scriptable Object/Card", order = 0)]
public class Card : ScriptableObject
{
public new string name;
public string description;
public Sprite artwork;
public int manaCost;
public int attack;
public int health;
public void Print()
{
Debug.Log(name + " : " + description + " The card Costs : " + manaCost);
}
}
스크립트 가능한 오브젝트를 사용하는 방법은 간단합니다. 위의 예제와 같이 Monobehavior 대신 ScriptableObject 클래스를 상속받고 해당 클래스를 에셋의 형태로 제작할 수 있게 만들어주는 CreateAssetMenu 속성을 추가하고 원하는 데이터를 추가해주면 됩니다.
이때 주의할 점은 스크립트 오브젝트는 하나의 에셋 데이터를 서로 참조하는 형태이기 때문에 현재 체력이나 마나 같은 변할 수 있는 값을 사용해서는 안됩니다. 또한 에디터 상에서는 스크립트 오브젝트의 생성과 데이터 저장이 자유롭지만 배포된 빌드에서는 새로 생성이 불가능하고 기존의 만들어둔 에셋만 사용이 가능합니다. 마지막으로 스크립트 오브젝트는 게임 빌드에 포함되기 때문에 사용자에 의해 악의적으로 데이터 변조가 가능할 수도 있기 때문에 멀티 플레이 게임에서는 사용에 주의가 필요합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CardDisplay : MonoBehaviour
{
public Card card;
public Text nameText;
public Text descriptionText;
public Image artworkImage;
public Text manaText;
public Text attackText;
public Text healthText;
private void Start()
{
nameText.text = card.name;
descriptionText.text = card.description;
artworkImage.sprite = card.artwork;
manaText.text = card.manaCost.ToString();
attackText.text = card.attack.ToString();
healthText.text = card.health.ToString();
}
}
참고 주소