개발일기
Scriptable Object 본문
1. Scriptable Object란?
Scriptable Object는 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너입니다.
데이터를 참조 형태로 오브젝트에서 가져올 수 있게 함으로써 메모리 할당을 최소화하고 고유한 값을 가질 수 있게 합니다.
MonoBehaviour와 마찬가지로 Scriptable Object는 기본 Unity 오브젝트에서 파생되나, MonoBehaviour와는 달리 Scriptable Object를 연결할 수 없으며 대신 프로젝트의 에셋으로 저장해야 합니다.
다음은 Scriptable Object를 사용하게 해주는 코드입니다.
using UnityEngine;
[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/SpawnManagerScriptableObject", order = 1)]
public class SpawnManagerScriptableObject : ScriptableObject
{
public string prefabName;
public int numberOfPrefabsToCreate;
public Vector3[] spawnPoints;
}
- CreateAssetMenu는 Asset -> 설정한 경로를 통해 에셋을 생성할 수 있도록 도와주는 기능입니다.
- Scriptable Object를 상속 받아 사용합니다.
2. Scriptable Object를 사용한 아이템 생성
Scriptable Object를 사용하여 아이템을 만들어 보겠습니다. 다음은 아이템의 정보를 저장할 Item Data Script입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu (fileName ="Item", menuName ="ScriptableObject/ItemData")]
public class ItemData : ScriptableObject
{
public enum ItemType { Bullet, Trap, Consumer, Key }
[Header("아이템 기본 정보")]
public ItemType itemType;
public Sprite itemIcon;
public int itemID;
public string ItemName;
[Header("총알,함정")]
public int itemCnt;
[Header("소비재")]
public int figure;
public ConsumerType consumerType;
}
Item Data의 정보를 가지고 있는 Item Script를 작성해줍니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Item : MonoBehaviour
{
public ItemData itemData;
SpriteRenderer spr;
private void Awake()
{
spr = GetComponent<SpriteRenderer>();
if (itemData != null)
spr.sprite = itemData.itemIcon;
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
switch (itemData.itemType)
{
case ItemData.ItemType.Bullet:
GameManager.instance.weaponManager.AddWeapon(itemData);
break;
case ItemData.ItemType.Trap:
GameManager.instance.weaponManager.AddWeapon(itemData);
break;
case ItemData.ItemType.Consumer:
DeliveryItem();
break;
case ItemData.ItemType.Key:
GameManager.instance.PickUpKey(itemData.itemID);
break;
}
gameObject.SetActive(false);
}
}
void DeliveryItem()
{
GameObject player;
player = GameObject.FindGameObjectWithTag("Player");
PlayerStat playerStat;
playerStat = player.GetComponent<PlayerStat>();
playerStat.GetConsumerItem(itemData);
}
}
게임 오브젝트를 생성해서 스크립트들을 컴포넌트로 넣어주고 연결해줍니다. 그 후 프리팹화 시키면 아이템 완성입니다.

