Unity

ScriptableObject - 1

CCS_Cheese 2025. 10. 10. 19:21

오늘 알아볼 내용은 ScriptableObject의 이론에 대해서 정리해보려고 합니다.

 

ScriptableObject란?

Unity 공식

 

ScriptableObject - Unity 매뉴얼

ScriptableObject는 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너입니다. ScriptableObject의 주요 사용 사례 중 하나는 값의 사본이 생성되는 것을 방지하

docs.unity3d.com

공식문서의 말을 인용하자면, 클래스와 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너입니다. 

 

특징

  • 값의 사본이 생성되는 것을 방지하여, 메모리 사용을 감소시킴.
  • 런타임에 데이터 컨테이너에 저장해 둔 값을 일괄적으로 변경이 가능.
  • 로비씬 -> 게임씬으로 Unity 씬이 바뀌어도 유지됨.
  • 데이터(ScriptableObject), 행동(Behaviour)으로 분리가 가능.

ScriptableObject 활용 예시

// PlayerConfig.asset
[CreateAssetMenu(menuName = "GameConfig/Player")]
public class PlayerConfig : ScriptableObject
{
    public float moveSpeed;
    public int maxHealth;
}

// PlayerController.cs
public class PlayerController : MonoBehaviour
{
    [SerializeField] private PlayerConfig config;

    private float health;

    private void Start()
    {
        health = config.maxHealth;
    }
}

 

ScriptableObject 활용하지 않았을 때

public class PlayerConfig 
{
    public float moveSpeed;
    public int maxHealth;
    public PlayerConfig(float moveSpeed, int maxHealth)
    {
       this.moveSpeed = moveSpeed;
       this.maxHealth = maxHealth;
    }
}

// PlayerController.cs
public class PlayerController : MonoBehaviour
{
    private PlayerConfig config;

    private float health;

    private void Start()
    {
    	config = new PlayerConfig(10f, 100);
        health = config.maxHealth;
    }
}

 

 

So를 활용하지 않으면, 씬이 이동될 때나 값이 변경될 때마다 해당 데이터에 대한 관리를 진행해야 하고, Monster와, Player의 데이터 관리를 행동이 행해지는 MonoScript에서 같이 관리되어 분리할 수가 없는 구조가 됩니다. 또한 데이터를 사본으로 중복생성하지 않기 때문에 메모리 효율성이 증가한다고도 표현할 수 있습니다.

 

다음 게시글에서는 구체적인 활용 예제 부터시작해서, 만드는 방법에 대해서 알아보겠습니다.