[Unity]ScriptableObjects

힐링힐링·2025년 2월 4일
0

UNITY

목록 보기
37/38

ScriptableObject는 MonoBehaviour보다 메모리 용량이 적다.
MonoBehaviours은 기본적으로 생성되므로 불필요한 메모리 용량을 차지한다.

ScriptableObjects란

ScriptableObjects는 프로젝트 레벨에서 데이터를 저장하고 관리하는 에셋으로, MonoBehaviour보다 메모리 효율이 좋다.

주요 장점

  • GameObject와 Transform 컴포넌트 오버헤드 제거
  • 씬 간 데이터 공유 용이
  • 중복 데이터 제거로 메모리 최적화
  • 런타임 중 변경이 필요 없는 정적 데이터 관리에 적합

실제 구현 예시

무기

// 비효율적인 방법 (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;
}

장점

  1. 메모리 사용량 감소
  2. 데이터 관리 용이성
  3. 에디터에서 쉽게 수정 가능
  4. 프리팹 간 데이터 공유 가능
  5. 버전 관리 용이

권장 상황:

  • 무기/아이템 데이터
  • 게임 설정
  • 레벨 데이터
  • 캐릭터 스탯
  • UI 설정
  • 사운드 설정

참고 영상

https://www.youtube.com/watch?v=aPXvoWVabPY

profile
블로그 이전합니다 https://james-kim-tech.tistory.com/

0개의 댓글

관련 채용 정보