데이터 에셋
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 23번째.
농장 게임에서 당근과 호박을 기릅니다. 당근은 30초 동안 자라며 5코인에 팔리고, 호박은 90초 동안 자라며 40코인에 팔립니다. 이 숫자들은 식물 하나가 아니라 작물에 속합니다. Plant 스크립트의 Inspector 필드로 두면 모든 씬의 모든 당근이 30과 5를 각각 복사해 갖게 되고, 값을 바꾸려면 그 복사본을 전부 찾아야 합니다. ScriptableObject는 이런 데이터를 에셋, 즉 프로젝트 안의 파일에 보관하므로 여러 객체가 같은 에셋을 참조할 수 있습니다. 그 클래스는 MonoBehaviour 대신 ScriptableObject를 상속합니다.
using UnityEngine;
[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
public string plantName;
public float growTime;
public int sellPrice;
}[CreateAssetMenu]를 사용하면 Project 창의 Create 메뉴에 이 클래스가 표시됩니다. Project 창에서 마우스 오른쪽 버튼을 클릭하고 Create > Farm > Plant Data를 선택하면 Unity가 NewPlant라는 에셋을 만듭니다. 이름을 Carrot으로 바꾸고 선택한 다음, Inspector의 필드에 Carrot, 30, 5를 입력합니다. Pumpkin 에셋도 같은 방법으로 만듭니다. MonoBehaviour와 마찬가지로 클래스 이름을 딴 PlantData.cs 파일에 클래스를 넣습니다.
동작은 에셋 유형의 필드를 가진 MonoBehaviour에 둡니다. Carrot 에셋을 해당 필드에 끌어다 놓으면 스크립트가 그 에셋을 통해 숫자를 읽습니다.
public class Plant : MonoBehaviour
{
public PlantData data;
private float age;
void Update()
{
age += Time.deltaTime;
if (age >= data.growTime)
{
Debug.Log(data.plantName + " is ready, worth " + data.sellPrice);
enabled = false;
}
}
}ScriptableObject는 어떤 GameObject에도 연결되어 있지 않고 어떤 씬에도 들어 있지 않습니다. Transform이 없으며 Unity는 이 객체의 Update나 Start를 호출하지 않습니다. ScriptableObject는 데이터를 보관하고 Plant는 동작을 담당합니다. 당근 200개가 하나의 Carrot 에셋을 참조한다면, 그 에셋의 growTime을 25로 설정할 때 200개 모두의 값이 바뀝니다. 코드에서는 ScriptableObject.CreateInstance<PlantData>()로 인스턴스를 만들며, new로는 만들지 않습니다.
챌린지
중급영웅의 설정을 데이터 에셋으로 옮기세요.
HeroData.cs에서public class HeroData : ScriptableObject를 작성하고, publicstring heroName,float moveSpeed,Color color를 선언하세요.- 바로 위 줄에
[CreateAssetMenu(menuName = "Heroes/Hero Data")]를 추가하세요. Hero.cs에서 세 필드를public HeroData data;로 바꾸고, 대신data.heroName,data.moveSpeed,data.color를 읽으세요.
‘플레이’를 누르세요. 빨간색 Knight가 속도 3으로 걷습니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
// HeroData: 영웅의 이름, 속도, 색상을 담은 ScriptableObject
Unity 게임 아키텍처의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드