Unity/개념 및 분석

Unity ScriptableObject 간단 정리

최애뎡 2021. 7. 12. 15:18
728x90
반응형

[ * 필자 Unity 버전 == 2020.3.6f1 ]

 

https://docs.unity3d.com/kr/2021.1/Manual/class-ScriptableObject.html

 

ScriptableObject - Unity 매뉴얼

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

docs.unity3d.com

ScriptableObject

- class, Instance와 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너 에셋

* [ MonoBehaviour와 마찬가지로 unity 오브젝트에서 파생되나 gameobject에 직접 연결하는 것이 아닌 에셋으로 저장 ]

- 메모리 사용 감소 

* [ 몬스터 prefab이 있고 prefab에 몬스터의 data를 직접 가지고 있다고 가정할 때 이를 여러 개 생성하면 몬스터 prefab이 각자의 data를 들고 있게 됨 -> 3마리 생성 -> 3개의 data 생성 == 여러 몬스터 => 여러 data 그러나 ScriptableObject를 사용하면 ScriptableObject하나를 참조하여 사용(메모리에 data사본을 하나만 저장 후 참조) -> 메모리 효율적 사용 ==> Data를 저장하는 prefab이나 공통적인 data를 ScriptableObject로 사용하는 게 좋음 ]
- 배포된 빌드에서는 ScriptableObject를 사용하여 data를 저장할 수 없으나(editor에서는 가능) 개발 시 설정한 ScriptableObject 에셋의 저장된 data를 사용할 수 있음

- Awake, OnEnable, OnDisable, OnDestroy의 콜백을 받음 (다만 ScriptableObject가 기준이 됨 -> ex ScriptableObject가 enable될때 OnEnable이 호출)

 

using UnityEngine;

[CreateAssetMenu(menuName = "ScriptableObject_/Player", order = 0)]
public class Player_ : ScriptableObject
{
    public string name;
    public int kill;

    public void print()
    {
        Debug.Log(name);
        Debug.Log(kill);        
    }

    private void Awake()
    {
        
    }

    private void OnEnable()
    {
        
    }

    private void OnDisable()
    {
        
    }

    private void OnDestroy()
    {
        
    }
}

ScriptableObject상속받고 사용

위처럼 asset을 생성하기 위해 [CreateAssetMenu(menuName = "ScriptableObject_/Player", order = 0)]

CreateAssetMenu -> Create안에 것들은 다 Asset들이지 그니까 이 menu에서 ScriptableObject asset을 생성하기 위해

menuName -> 말 그대로 Menu name인데 /를 통해 경로를 설정할 수 있음

* fineName도 설정 가능 - asset생성시 default file name임

order - ScriptableObject가 여러개일 경우 몇 번째에 보이게 할 것인지 설정

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScriptableTest : MonoBehaviour
{
    public Player_ playerData;

    private void Start()
    {
        playerData.print();        
    }
}

이런 식으로 ScriptableObject를 가져와서 사용 가능함

 

이 정리는 그냥 기본적인 느낌만 보는 아주 간단한 예시이고

뭘 하든간에 공통으로 사용하는 Data를 따로 빼서 사용하기 참 좋을 것 같음

여러 같은 몬스터가 하나의 정보만 참조하고 있으면 메모리를 더 효율적으로 사용 가능할 것이니까 이런 느낌으로

반응형