스크립터블 오브젝트는 유니티에서 제공하는 데이터 컨테이너로 게임에서 사용되는 데이터를 게임 리소스에 미리 저장하여 사용할 수 있습니다. Scriptable Object를 사용하기 전에는 일반 스크립트로 데이터 저장 구조를 만들고 프리팹으로 만들어 데이터를 입력하고 사용하는 방식으로 사용되었습니다. 저는 쉽게 이해하기 위해 스크립터블 오브젝트를 "스크립팅이 가능한 리소스 오브젝트"라고 바꿔서 이해하고 사용하고 있습니다. 이번 포스팅에서는 스크립터블 오브젝트의 사용방법과 관련 예시를 작성해 보겠습니다.
1. 스크립터블 오브젝트 선언
스크립터블 오브젝트를 만들기 전에 프로젝트 내에 C# 스크립트로 구조를 선언해야 합니다.
using UnityEngine;
[CreateAssetMenu]
public class Item : ScriptableObject
{
public int price;
}
1-1. 스크립터블 오브젝트 만들기
스크립트 파일이 컴파일되고 프로젝트 뷰에서 우클릭하여 Item이 create 에셋 메뉴에 추가된 것을 확인할 수 있습니다. 해당 메뉴 클릭을 통해 Item 스크립터블 오브젝트를 생성하고 값을 입력 저장할 수 있습니다.
1-2. CreateAssetMenu 옵션
에셋 메뉴를 생성할 때 옵션을 사용하여 default 파일 이름, 메뉴 트리, 메뉴 순번 지정할 수 있습니다. 아래의 코드를 추가하여 생성하면 메뉴 마지막에 Scriptable Object 서브메뉴가 생성되고 Item을 만들 때 파일 이름이 ItemSO로 지정됩니다.
using UnityEngine;
[CreateAssetMenu(fileName = "ItemSO", menuName = "Scriptable Object/Item", order = int.MaxValue)]
public class Item : ScriptableObject
{
public int price;
}
스크립터블 오브젝트 만들기 요점
- 스크립터블 오브젝트 생성 전 스크립트로 구조를 선언해야 합니다.
- 선언된 스크립터블 오브젝트는 에셋 메뉴를 통해 만들 수 있습니다.
- 생성된 스크립터블 오브젝트에 값을 저장할 수 있습니다.
- 스크립터블 오브젝트 생성 시 옵션을 통해 파일 이름, 순번, 메뉴 이름을 정할 수 있습니다.
2. 스크립터블 오브젝트 사용 예시
아래는 스크립터블 오브젝트를 사용해 Item의 리스트를 데이터베이스화하고 게임 내에서 아이템이 생성될 때마다 값을 읽어 생성하는 코드입니다.
2-1. item.cs
스크립터블 오브젝트의 값을 읽어와 적용할 클래스입니다. ItemSO와 동일한 데이터 구조를 가지고 있습니다.
using UnityEngine;
public class Item : MonoBehaviour
{
public string itemName;
public Sprite itemIcon;
public int price;
}
2-2. 스크립터블 오브젝트 선언 및 생성 - item.so
스크립터블 오브젝트를 아래와 같이 선언하고 Sword, Wand, Bow를 만들어 값을 입력했습니다.
using UnityEngine;
[CreateAssetMenu(fileName = "ItemSO", menuName = "Scriptable Object/ItemSO", order = int.MaxValue)]
public class ItemSO : ScriptableObject
{
public string itemName;
public Sprite itemIcon;
public int price;
}
2-2. 스크립터블 오브젝트의 데이터로 아이템 생성 및 데이터 할당 - ItemCreator.cs
아래는 스크립터블 오브젝트의 데이터로 신규 아이템을 생성하고 인벤토리에 추가하고 마지막에 전체 인벤토리 Item의 정보를 출력하는 예시입니다.
using System.Collections.Generic;
using UnityEngine;
public enum ItemType { BOW, SWORD, WAND }
public class ItemCreator : MonoBehaviour
{
List<Item> itemInventory = new List<Item>();
public ItemSO[] itemDB;
public void ItemCreate(ItemType inputWeaponType)
{
int itemIndex = (int)inputWeaponType;
GameObject itemGO = new GameObject(inputWeaponType.ToString());
itemGO.transform.parent = this.gameObject.transform;
Item item = itemGO.AddComponent<Item>();
item.itemName = itemDB[itemIndex].itemName;
item.itemIcon = itemDB[itemIndex].itemIcon;
item.price = itemDB[itemIndex].price;
itemInventory.Add(item);
}
void Start()
{
ItemCreate(ItemType.BOW);
ItemCreate(ItemType.SWORD);
ItemCreate(ItemType.WAND);
ShowInventoryItems();
}
void ShowInventoryItems()
{
foreach(Item i in itemInventory)
{
Debug.Log(i.itemName + " price: " + i.price);
}
}
}
아래는 프로젝트 인스펙터 레퍼런스 참고 그림과 결과 값입니다.
이번 포스팅에서는 스크립터블 오브젝트를 이용해 데이터를 미리 저장하고 읽어오는 방법을 알아봤습니다.
'유니티 이야기' 카테고리의 다른 글
[Unity] 유니티 게임 오브젝트를 찾는 방법 - GameObject (1) | 2022.09.16 |
---|---|
[Unity] 유니티 컴포넌트를 찾는 방법 - GetComponent (0) | 2022.09.15 |
[Unity] 프로그래밍에 쉽게 입문하는 방법 (0) | 2022.09.05 |
[Unity] 구글 시트에서 데이터 읽어오기 (0) | 2022.09.04 |
[Unity] 2022 구글 애드몹 광고 통합 튜토리얼 (0) | 2022.09.03 |
댓글