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 메서드 내에 다양한 기능을 추가할 수 있다.
꼭 아이템이 아니어도 여러분야에 사용가능하다.
장점 요약
데이터의 재사용성 증가: 여러 객체나 씬에서 동일한 데이터를 공유할 수 있다.
에디터 내에서 손쉬운 데이터 관리: 직관적인 인스펙터를 통해 데이터를 쉽게 편집하고 관리할 수 있다.
메모리 효율성: 동일한 데이터가 여러 인스턴스에서 중복되지 않고 하나의 에셋으로 관리되므로 메모리 사용을 최적화할 수 있다.
유지보수 용이성: 데이터와 로직이 분리되어 있어 코드의 유지보수가 용이하다.
'유니티 공부' 카테고리의 다른 글
RigidBody를 이용한 이동 AddForce와 Velocity (GetAxis) (0) | 2024.10.29 |
---|---|
정적할당과 동적할당(Unity, C#) (0) | 2024.10.28 |
Unity Object Pool(오브젝트 풀) 설명과 사용예시 (3) | 2024.10.23 |
싱글톤 패턴 (0) | 2024.10.22 |
Unity 오브젝트를 스크립트로 찾는법 (1) | 2024.10.18 |