Menu
CoddyTech

데이터 에셋

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로는 만들지 않습니다.

challenge icon

챌린지

중급

영웅의 설정을 데이터 에셋으로 옮기세요.

  1. HeroData.cs에서 public class HeroData : ScriptableObject를 작성하고, public string heroName, float moveSpeed, Color color를 선언하세요.
  2. 바로 위 줄에 [CreateAssetMenu(menuName = "Heroes/Hero Data")]를 추가하세요.
  3. Hero.cs에서 세 필드를 public HeroData data;로 바꾸고, 대신 data.heroName, data.moveSpeed, data.color를 읽으세요.

‘플레이’를 누르세요. 빨간색 Knight가 속도 3으로 걷습니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

// HeroData: 영웅의 이름, 속도, 색상을 담은 ScriptableObject

Unity 게임 아키텍처의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드