ScriptableObject는 MonoBehaviour보다 메모리 용량이 적다.
MonoBehaviours은 기본적으로 생성되므로 불필요한 메모리 용량을 차지한다.
ScriptableObjects는 프로젝트 레벨에서 데이터를 저장하고 관리하는 에셋으로, MonoBehaviour보다 메모리 효율이 좋다.
무기
// 비효율적인 방법 (MonoBehaviour 사용)
public class WeaponStats : MonoBehaviour
{
public float damage = 10f;
public float range = 100f;
public float fireRate = 0.5f;
public string weaponName = "Basic Gun";
}
// 최적화된 방법 (ScriptableObject 사용)
[CreateAssetMenu(fileName = "WeaponData", menuName = "Game/Weapon Data")]
public class WeaponData : ScriptableObject
{
public float damage;
public float range;
public float fireRate;
public string weaponName;
}
// WeaponData 사용하는 컴포넌트
public class Weapon : MonoBehaviour
{
public WeaponData weaponData; // 참조만 저장
void Fire()
{
// weaponData의 속성 사용
float damage = weaponData.damage;
// ... 발사 로직
}
}
인벤토리 시스템
[CreateAssetMenu(fileName = "InventoryData", menuName = "Game/Inventory Data")]
public class InventoryData : ScriptableObject
{
public int maxSlots = 20;
public float weightLimit = 100f;
public List<ItemData> defaultItems;
}
[System.Serializable]
public class ItemData
{
public string itemName;
public float weight;
public Sprite icon;
}
// 인벤토리 사용
public class PlayerInventory : MonoBehaviour
{
public InventoryData inventorySettings;
private List<ItemData> currentItems = new List<ItemData>();
void Start()
{
// 공유된 설정 사용
int maxItems = inventorySettings.maxSlots;
// 기본 아이템 초기화
currentItems.AddRange(inventorySettings.defaultItems);
}
}
게임 설정 관리
[CreateAssetMenu(fileName = "GameSettings", menuName = "Game/Settings")]
public class GameSettings : ScriptableObject
{
[Header("Audio Settings")]
public float masterVolume = 1f;
public float musicVolume = 0.8f;
public float sfxVolume = 1f;
[Header("Graphics Settings")]
public int qualityLevel = 2;
public bool usePostProcessing = true;
[Header("Gameplay Settings")]
public float difficulty = 1f;
public bool tutorialEnabled = true;
}