[Unity] ScriptableObject 활용하기

네,가능합니다 ㅣ 2024. 10. 14. 10:59

오늘은 ScriptableObject 을 활용하는 방법에 대해 알아보겠다.

 

ScriptableObject을 사용하는 이유는 ?

 

다양한 장점이 있지만 주요 장점 중 하나는 데이터의 참조와 메모리 효율성이다.

ScriptableObject은 메모리 사용을 절약하며, 여러 오브젝트가 같은 데이터를 참조하게 해주기 떄문에 성능상의 이점이 크다.

 

아래의 예제코드와 설명을 따라해보면 이해가 정말 쉬울것이다.

예제코드에서는 아이템 데이터를 관리하는것을 보여주겠다.

 

첫번째로 Item ScriptableObject 를 정의하겠다.

using UnityEngine;

[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
public class Item : ScriptableObject
{
    public string itemName;    // 이름
    public Sprite icon;        // 아이콘
    public string description; // 설명
    public int value;          // 가격 혹은 전투력 ? 이런 부분이 될 수 있음
}

이 스크립트를 작성한 것 만으로도 지금 바로 유니티에서 CreateAssetMenu 직관적으로 아이템을  생성이 가능하다.

너무 재밌지 않은가...!

이번에는 아이템을 관리하는 ItemDatabase를 만들겠다.

using UnityEngine;
using System.Collections.Generic;

[CreateAssetMenu(fileName = "ItemDatabase", menuName = "Inventory/ItemDatabase")]
public class ItemDatabase : ScriptableObject
{
    public List<Item> items = new List<Item>();  // 아이템 리스트를 생성

    // 아이템 코드로 아이템을 찾는 메서드 (index)
    public Item GetItemIndex(int index)
    {
        if (index >= 0 && index < items.Count)
            return items[index];
        return null;
    }
}

데이터베이스를 만들어서 아이템을 넣어둘 아이템 리스트를 만들어 주고, 아이템 코드로 특정 아이템을 꺼낼 수 있는 메서드를 작성해두었다. 이제 인벤토리매니저를 만들어보자(약식)

using UnityEngine;

public class InventoryManager : MonoBehaviour
{
    public ItemDatabase itemDatabase;  // 아이템 데이터베이스를 불러오고

    void Start()
    {
        // firstItem에 인덱스0의 아이템을 넣어주고
        Item firstItem = itemDatabase.GetItemIndex(0);
        // 만약 firstItem이 있다면
        if (firstItem != null)
        {
        // 해당 아이템의 이름과 설명을 출력한다.
            Debug.Log("아이템 이름: " + firstItem.itemName);
            Debug.Log("아이템 설명: " + firstItem.description);
        }
    }

    // 아이템 사용 메서드
    public void UseItem(int index)
    {
        Item item = itemDatabase.GetItemIndex(index);
        if (item != null)
        {
            Debug.Log(item.itemName + "을(를) 사용했습니다.");
        }
    }
}

실제로 게임에 그대로 적용할만한 코드는 아니지만, 이해를 하기엔 매우 쉬운 코드라고 생각된다.

 

이렇게 하고 끝이 아닌, 유니티에서 본격적으로 ScriptableObject를 사용해보자

 

1. Assets > Create > Inventory > Item 을 선택해서 원하는 아이템을 만든다. - 아이템 데이터 생성

2. Assets > Create > Inventory > ItemDatabase 를 선택하고 아이템 데이터를  ItemDatabase의 item 리스트에 추가한다.

3. InventoryManager을 사용하는 오브젝트에 ItemDatabase를 할당한다.

 

끝!