개발일기

Scriptable Object 본문

Unity TeamProject/ToyRush

Scriptable Object

김조성준 2023. 8. 19. 20:49

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);
    }
}

 

게임 오브젝트를 생성해서 스크립트들을 컴포넌트로 넣어주고 연결해줍니다. 그 후 프리팹화 시키면 아이템 완성입니다.

스크립트 넣고 프리팹화 시키기
Scriptable Object 데이터