Menu
CoddyTech

데이터 에셋

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 19번째.

농장 게임에서 당근과 호박을 기릅니다. 당근은 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

챌린지

중급

Hero는 화살표 키로 경기장을 돌아다닙니다. 이름, 속도, 색상은 Hero 스크립트의 필드이며, 새 Hero를 만들 때마다 이 값들을 다시 복사해야 합니다. 이 값들을 에셋으로 옮기세요:

  • HeroData.cs에서 공개 필드 heroName(문자열), moveSpeed(실수) 및 color(Color)를 가진 ScriptableObject인 HeroData를 작성하세요. 메뉴 이름이 Heroes/Hero Data인 [CreateAssetMenu]를 지정하세요.
  • Hero.cs에서 세 필드를 HeroData 유형의 공개 필드 data 하나로 교체하고, 스크립트에서 자체 필드를 사용하던 곳에서 에셋의 값을 사용하세요.

프로젝트에는 해당 메뉴로 만든 Knight 에셋(Knight, 속도 3, 빨간색)이 있으며, Inspector에서 이를 Hero의 data 필드에 넣습니다. Play를 누르고 Knight를 움직여 경기장을 돌아다닌 다음 Check를 누르세요.

직접 해보기

using UnityEngine;

// HeroData: 영웅의 이름, 속도, 색상을 ScriptableObject로 표현
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

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