Unity - ScriptableObject

MothorMoth·2024년 5월 21일
0

Unity

목록 보기
3/5
post-thumbnail

Unity - ScriptableObject (Unity 2022.3)

ScriptableObject는 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너이다.

ScriptableObject의 주요 사용 사례 중 하나는 값의 사본이 생성되는 것을 방지하여 프로젝트의 메모리 사용을 줄이는 것이다.

이는 연결된 MonoBehaviour 스크립트에 변경되지 않는 데이터를 저장하는 프리팹이 있는 프로젝트의 경우 유용하다.

이러한 프리팹을 인스턴스화할 때마다 데이터의 사본을 중복 생성하는 것이 아니라 동일한 ScriptableObject 인스턴스를 참조를 통해 접근할 수 있다. 즉 메모리에 데이터 사본을 하나만 저장한다.

ScriptableObject는 기본 Unity 오브젝트에서 파생되나, MonoBehaviour와는 달리 게임 오브젝트에 ScriptableObject를 연결할 수 없으며 대신 프로젝트의 에셋으로 저장해야 한다.

ScriptableObject는 에디터 네임스페이스와 에디터 스크립팅을 사용하기 때문에 데이터를 저장하는 작업은 편집할 때나 런타임에 가능하다.

배포된 빌드에서는 ScriptableObject를 사용하여 데이터를 저장할 수 없으나, 개발 시 설정한 ScriptableObject 에셋의 저장된 데이터를 사용할 수 있다.

ScriptableObject의 주요 사용 사례

  1. 에디터 세션 동안 데이터 저장 및 보관
  2. 데이터를 프로젝트의 에셋으로 저장하여 런타임 시 사용

ScriptableObject 에셋 생성

ScriptableObject를 사용하려면 Assets 폴더에 스크립트를 생성하고 ScriptableObject 클래스를 상속 해줘야 한다.

CreateAssetMenu를 사용하면 더욱 간편하게 커스텀 에셋을 생성할 수 있다.

using UnityEngine;

[CreateAssetMenu(fileName = "MonsterBaseData", menuName = "Data/Monster/BaseStat", order = 0)]
public class StatSO : ScriptableObject
{
    [Header("BaseStat Info")]
    public string monsterName;
    public int healthPoint;
    public float damage;
    public float speed;
}

Unity 에디터에서 위 스크립트를 이용하여 ScriptableObject의 인스턴스를 생성할 수 있다.

생성된 ScriptableObject 인스턴스에 이름을 설정하고 인스펙터 창에서 값을 설정할 수 있다.

ScriptableObject 에셋 사용

해당 데이터 에셋을 사용하려면 ScriptableObject를 참조하는 새로운 스크립트를 만들어야 한다.

using UnityEngine;

public class Goblin : MonoBehaviour
{
    public StatSO goblinData;

    private void Start()
    {
        print($"이름: {goblinData.monsterName}");
        print($"체력: {goblinData.healthPoint}");
        print($"데미지: {goblinData.damage}");
        print($"이동속도: {goblinData.speed}");
    }
}

씬에 오브젝트를 배치하고, Goblin 스크립트를 컴포넌트로 추가한 뒤, ScriptableObject를 할당해 준다.

플레이를 누르면, 데이터 출력이 잘 되는 것을 볼 수 있다.

0개의 댓글

관련 채용 정보