본문 바로가기
유니티 공부

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

by g-builder 2024. 10. 24.

ScriptableObject는 Unity에서 제공하는 데이터 컨테이너로, 주로 게임의 설정, 데이터, 공통적으로 사용되는 정보를 저장하는 데 사용된다. 주요 특징은 다음과 같다.

1.에셋으로 저장: ScriptableObject는 프로젝트 내에서 에셋으로 저장되므로, 여러 씬이나 객체에서 쉽게 참조하고 공유할 수 있다.

2.메모리 절약: 인스턴스화할 필요 없이 에셋으로 존재하므로 메모리 사용을 줄일 수 있다.

3.에디터 친화적: 인스펙터를 통해 데이터를 쉽게 편집할 수 있으며, 에디터 스크립트를 통해 확장성 있게 사용할 수 있다.

4.데이터 중심 개발: 코드와 데이터를 분리하여 관리할 수 있어 유지보수성과 재사용성이 높아진다.

예를 들어, RPG 게임에서 다양한 아이템(무기, 방어구, 소비 아이템 등)을 관리한다고 가정한다. 각각의 아이템은 이름, 설명, 이미지, 속성 등을 가지고 있다. 이때 ScriptableObject를 사용하면 각 아이템의 데이터를 효율적으로 관리할 수 있다.

 

ScriptableObject 클래스 정의하기

먼저, 아이템 데이터를 저장할 ScriptableObject 클래스를 정의한다.

1
2
3
4
5
6
7
8
9
10
11
using UnityEngine;
 
[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
public class Item : ScriptableObject
{
    public string itemName;       // 아이템 이름
    public string description;    // 아이템 설명
    public Sprite icon;           // 아이템 이미지
    public int value;             // 아이템 가치
}
 
cs

 

CreateAssetMenu 어트리뷰트를 사용하면 Unity 에디터 내에서 쉽게 에셋을 생성할 수 있다.

각 필드는 인스펙터에서 편집할 수 있는 공개 변수로 설정된다.

에셋 생성하기

1.Unity 에디터에서 생성하고자 하는곳의 폴더를 우클릭한다.

2.Create > Inventory > Item을 선택한다.

3.새로 생성된 에셋에 원하는 이름을 지정하고, 인스펙터에서 각 필드를 채운다.

ScriptableObject 사용하기

생성한 Item 에셋을 게임 내에서 사용할 수 있다. 예를 들어, 플레이어의 인벤토리에 아이템을 추가하는 스크립트를 작성한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using UnityEngine;
using System.Collections.Generic;
 
public class Inventory : MonoBehaviour
{
    public List<Item> items = new List<Item>(); // 인벤토리에 담긴 아이템 리스트
 
    // 아이템 추가 메서드
    public void AddItem(Item newItem)
    {
        if (newItem != null)
        {
            items.Add(newItem);
            Debug.Log(newItem.itemName + "이(가) 인벤토리에 추가되었습니다.");
        }
    }
 
    // 아이템 제거 메서드
    public void RemoveItem(Item itemToRemove)
    {
        if (items.Contains(itemToRemove))
        {
            items.Remove(itemToRemove);
            Debug.Log(itemToRemove.itemName + "이(가) 인벤토리에서 제거되었습니다.");
        }
    }
}
 
cs

 

 

 

Inventory 스크립트는 Item 타입의 리스트를 관리하며, 아이템을 추가하거나 제거하는 기능을 제공한다.

Item 에셋을 드래그 앤 드롭으로 인벤토리의 리스트에 추가할 수 있다.

아이템 사용 예시

플레이어가 특정 아이템을 사용할 때의 동작을 구현할 수 있다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using UnityEngine;
 
public class ItemUsage : MonoBehaviour
{
    public Inventory playerInventory;
 
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.U)) // 'U' 키를 누르면 아이템 사용
        {
            if (playerInventory.items.Count > 0)
            {
                Item firstItem = playerInventory.items[0];
                UseItem(firstItem);
                playerInventory.RemoveItem(firstItem);
            }
            else
            {
                Debug.Log("인벤토리에 사용 가능한 아이템이 없습니다.");
            }
        }
    }
 
    void UseItem(Item item)
    {
        // 아이템 사용 로직 구현
        Debug.Log(item.itemName + "을(를) 사용했습니다.");
        // 예: 체력 회복, 공격력 증가 등
    }
}
 
cs

 

 

플레이어가 'U' 키를 누르면 인벤토리에 있는 첫 번째 아이템을 사용하고, 인벤토리에서 제거한다.

실제 게임 로직에 따라 UseItem 메서드 내에 다양한 기능을 추가할 수 있다.

꼭 아이템이 아니어도 여러분야에 사용가능하다.

 

장점 요약

데이터의 재사용성 증가: 여러 객체나 씬에서 동일한 데이터를 공유할 수 있다.

에디터 내에서 손쉬운 데이터 관리: 직관적인 인스펙터를 통해 데이터를 쉽게 편집하고 관리할 수 있다.

메모리 효율성: 동일한 데이터가 여러 인스턴스에서 중복되지 않고 하나의 에셋으로 관리되므로 메모리 사용을 최적화할 수 있다.

유지보수 용이성: 데이터와 로직이 분리되어 있어 코드의 유지보수가 용이하다.