2024. 5. 27. 19:51ㆍUnity/Unity 학습정리
이번에는 Scriptable Object에 대해서 공부했다. Scriptable Object란 많은 오브젝트에 들어가는 데이터를 한번에 관리할 수 있는 것이다. 예를들어 아이템에는 아이템 이름, 아이템 설명, 아이템 타입, 공격력, 방어력 등등 많은 데이터들이 들어간다. 그럼 아이템들을 제작할때마다 스크립트에 해당 필드들을 붙히는것은 비효율적이고 메모리 관점으로도 좋지 않다. Scriptable Object를 이용하면 해당 데이터들을 손쉽게 관리할 수 있다.
Scriptable Object
변경되지 않는 데이터들을 만들어놓고 사용하면 Prefab에서 Instantiate를 통해 꺼내서 사용할때 Scriptable Object를 참조하면 된다. 해당 방식이 아닌 필드에 작성해놓은 방식이라면 Instantiate을 할 때마다 데이터 사본을 만들어 참조하는 방식으로 이는 매우 비효율 적이다.
public class ItemData : ScriptableObject
{}
클래스 정의는 매우 간단하다. Monobehaviour를 지우고 ScriptableObject를 상속받으면 된다.
[CreateAssetMenu(fileName = "Item", menuName = "New Item")]
public class ItemData : ScriptableObject
{
[Header("ItemInfo")]
public string itemName;
public string itemDesc;
public ItemType type;
public Sprite icon;
public GameObject dropPrefab;
[Header("Equip")]
public GameObject equipPrefab;
[Header("Consumable")]
public ItemDataConsumable[] consumables;
}
현재 만들고 있는 프로젝트의 스크립터블오브젝트 cs파일인데 CreateAssetMenu를 이용해 해당 데이터를 가진 Scriptable Object를 유니티 에디터 상에서 생성 할 수 있게 한다. Header를 두어 여러 데이터들에 대해서 정리를 하고 필요한 데이터를 집어 넣어 간단하게 아이템의 데이터를 생성하는 것이다.
public enum ItemType
{
Equipable,
Consumable,
Resource,
Interactable,
Object
}
public enum ConsumableType
{
Health,
Hunger,
Speed
}
[Serializable]
public class ItemDataConsumable
{
public ConsumableType type;
public float value;
}
Enum을 이용해서 아이템 타입자체를 데이터로 사용해도되고 만약 먹을 수 있는 아이템이라면 먹었을 때 어떤 스텟에 영향을 줄지 정하는 ConsumableType도 정하여 사용할 수 있다.
public class Item : MonoBehaviour, IInteractable
{
public ItemData itemdata;
public string GetInteractPrompt()
{
return $"{itemdata.itemName}\n{itemdata.itemDesc}";
}
public void OnInteract()
{
if(itemdata.type != ItemType.Object)
{
CharacterManager.Instance.Player.itemData = itemdata;
CharacterManager.Instance.Player.addItem?.Invoke();
Destroy(gameObject);
}
}
}
이 스크립트는 실제로 아이템에 붙는 스크립트인데 여러 데이터를 나열할 필요없이 ItemData itemdata를 부여받아 내가 미리 입력해놓은 데이터들을 모두 가지고 있게 할 수 있다. 해당 데이터를 이용해서 GetInteractPrompt() 프롬프트 창에 띄울 텍스트를 바로 데이터에서 꺼내서 리턴 할 수도 있다.
유니티 에디터 상에서 Box 아이템 데이터를 생성하는 과정이다. 원하는 데이터를 집어넣어서 그저 Box에 붙어있는 Item스크립트에 넣어주기만 하면 끝난다.
마무리
개인과제 주차에서 Scriptable Object를 이용해 아이템 타입에 따라서 아이템 사용시에 여러가지 처리를 가능하게 할 수 있다. 인벤토리에 넣을 때도 아이템 타입에 따라 들어가는 갯수가 다르게 설정할 수 있고 장착을 할 수 있는 아이템 그리고 사용할 수 있는 아이템 등 여러가지 방식으로 데이터를 처리할 수 있다는 생각이 들었다. 다음 포스팅은 인벤토리에 관한 포스팅이 될 거 같다.
'Unity > Unity 학습정리' 카테고리의 다른 글
Unity - FSM(Finite State Machine)(1) (0) | 2024.06.17 |
---|---|
Unity - 슬라이더바로 사운드 조절하기 (1) | 2024.06.05 |
Unity - Object Pool (0) | 2024.05.23 |
Unity - 싱글톤 패턴 (0) | 2024.05.21 |
Unity - Vector2.Dot으로 시야각 구하기 (0) | 2024.05.17 |