20231212_ScriptableObject

2023. 12. 12. 22:06IT/TIL

오늘의 TIL은 스크립터블 오브젝트(Scriptable Object)에 관한 내용이다.

 

- 스크립터블 오브젝트는 Unity에서 데이터를 저장하고 관리하는 유연한 데이터 컨테이너입니다.
- 게임에서 재사용 가능한 데이터 또는 설정을 저장하는 데 사용됩니다.
- 코드와 데이터를 분리하여 코드를 더 깔끔하고 관리하기 쉽게 만듭니다.
- 하나의 스크립터블 오브젝트를 여러 게임 오브젝트에서 참조하거나 재사용할 수 있습니다.

 

Scriptable Object(스크립터블 오브젝트)

스크립터블 오브젝트란 유니티에서 제공하는 데이터 컨테이너로 데이터를 유연하게 저장하고 관리할 수 있게 해줍니다.

특히, 게임에서 사용되는 재사용 가능한 데이터 또는 설정을 저장하는데 사용됩니다.

스크립터블 오브젝트를 사용하면 코드와 데이터를 분리하여 코드를 더 깔끔하고 관리하기 쉽게 만들 수 있습니다.

하나의 스크립터블 오브젝트를 여러 게임 오브젝트에서 참조하거나 재사용할 수 있습니다.

 

아래는 코드포스팅 이라는 블로그에서 본 정보를 공부하며 적은 내용입니다.

 

스크립터블 오브젝트의 사용방법과 관련 예시

1. 스크립터블 오브젝트의 선언

스크립터블 오브젝트를 만들기 전에 프로젝트 내에서 C# Script로 구조를 선언해야 합니다.

 

더보기
using UnityEngine;
[CreateAssetMenu]
public class Item : ScriptableObject
{
	public int price;
}

 

1-1. 스크립터블 오브젝트 만들기

스크립트 파일이 컴파일되고 프로젝트에서 우클릭 후에 Create 메뉴로 가면 Item이 추가된 것을 확인할 수 있습니다.

이 메뉴를 통해서 Item 스크립터블 오브젝트를 생성하고 값을 입력 저장할 수 있습니다.

1-2. CreateAssetMenu 옵션

AssetMenu를 생성할 때 옵션을 사용하여 defalut 파일 이름, 메뉴 트리, 메뉴 순번을 지정할 수 있습니다.

아래의 코드를 추가하여 생성하면 메뉴 마지막에 Sriptable Object 서브메뉴가 생성되고 Item을 만들 때

파일 이름이 ItemSO로 지정됩니다.

using UnityEngine;

[CreateAssetMenu(fileName = "ItemSO", menuName = "Scriptable Object/Item", order = int.MaxValue)]

public class Item : ScriptableObject
{
	public int price;
}

 

 

맨 위에 있던 Item이 맨 아래의 Scriptable Object의 Item으로 이동된 것을 확인할 수 있다.

(menuName = "Scriptable Object/Item"의 효과로 menu가 Scriptable Object -> Item으로 이동한 것입니다)

(order = int.MaxValue의 효과로 맨 아래로 이동한 것입니다)

 

스크립터블 오브젝트 만들기의 요점

  • 스크립터블 오브젝트 생성 전 스크립트로 구조를 선언해야 합니다.
  • 선언된 스크립터블 오브젝트는 에셋 메뉴를 통해 만들 수 있습니다.
  • 생성된 스크립터블 오브젝트에 값을 저장할 수 있습니다.
  • 스크립터블 오브젝트 생성 시 옵션을 통해 파일 이름, 순번, 메뉴 이름을 정할 수 있습니다.

 

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;

[CreatAssetMenu(fileName = "ItemSO", menuName = "Scriptable Object/ItemSO", order = int.MaxValue)]

public class ItemSO : ScriptableObject
{
    public stirng itemName;
    public Sprite itemIcon;
    public int price;
}

 

 

위에서 작업한 스크립트를 가지고 위 처럼 스크립터블 오브젝트를 만들었다.

 

2-3. 스크립터블 오브젝트의 데이터로 아이템 생성 및 데이터 할당 - ItemCreator.cs

아래는 스크립터블 오브젝트의 데이터로 신규 아이템을 생성하고 인벤토리에 추가하고

마지막에 전체 인벤토리 Item의 정보를 출력하는 예시입니다.

 

using System.Collections;
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);            
        }
    }
}

 

 

위 처럼 설정하면 완성입니다.

 

 

오늘은 강의에서 배웠던 스크립터블 오브젝트를 좀 더 공부해보고자 인터넷을 찾아봤는데

코드포스팅 이라는 블로그를 찾게 되었고, 이 블로그를 통해 공부할 수 있었다.

이 외에도 많은 정보들이 있어서 추후에도 보면서 공부할 예정이다.

'IT > TIL' 카테고리의 다른 글

20231214_프리펩,ItemSlot  (0) 2023.12.14
20231213_Class  (0) 2023.12.14
20231211_SOLID원칙, LayerMask, 싱글톤  (1) 2023.12.11
20231208_Generic, 오브젝트풀, SOLID원칙  (0) 2023.12.08
20231207_팀 프로젝트 회고  (1) 2023.12.07