본문 바로가기

TOOL/Unity

Scriptable Object

Scriptable Object


Unity에서 Script를 Component형식으로 사용하지 않고 Script자체를 Object로 사용하는 방식이다.

기존의 XML이나 JSON을 대신해서 데이터를 일정 고정값으로 보관하고 있다가 해당 data가 필요할 때

Scriptable Object를 new 하지 않고 data를 사용할 수 있다.


일종의 data만 가지고 있는 object를 사용하기 위해 있는 것이다.

해당객체는 생성시 new가 아닌 CreateInstance를 사용해야 한다.


    

public class BuildSetting : ScriptableOjbect
{
    [SerializeField, Tooltip("빌드 결과물(apk 파일의 이름")]
    private string m_buildName = "GameName";
    [SerializeField, Tooltip("버전정보")]
    private string m_version = "0.0.1a";
    
    //build 정보를 가지고 있는 asset 객체를 만든다.
    private static BuildSetting s_asset;
    private static BuildSetting asset 
    {
        get
        {
            if (null == s_asset)
            {
                LoadBuildSetting();
            }
            return s_asset;
        }
    }

    //BuildName의 getter
    public static string BuildName 
    {
        get { return asset.m_buildName; }
    }
    //Version의 getter
    public static string Version
    {
        get { return asset.m_version; }
    }

} 
//이런식으로 고정값을 가진 Scriptable Object를 만든 뒤
//CreateInstance함수를 이용해 static 객체로 instance를 만든다.


//이후 다른 빌드하는 클래스에서 사용할 때 이런식으로 사용한다.
public static class Builder
{
    string szBuildName = BuildSetting.BuildName;
    PlayerSettings.bundleVersion = BuildSetting.Version;
}




Unity에서만 사용하는 unity resource(Texture 2D 등)같은것들을 다룰땐

WebServer 혹은 Local folder에 resource를 save하고 resource path information을 기반으로 load하는 로직을

만들어야 하므로 복잡해질 수 있는데 이를 간단히 Scriptable Object를 사용하므로 간단하게 처리할 수 있다.



    
[Serializable]
public class CustomData : ScriptableObject {
         [SerializeField]
         float myData; 
         [SerializeField]
         Texture2D myTexture; //이런식으로 unity에서 사용하는 resource data를 저장해놓은 뒤 필요할때마다 불러 사용할 수 있다.
         public float MyData
         {
                  get
                  {
                           return myData;   
                  }
         }
}




단점


Unity에서만 지원하는, unity system에 맞는 구조로 만들어진 기능이라 JSON이나 xml에 비해 범용성이 뒤떨어진다.

따라서 Server - Client 통신에서 작은 size의 빠른 data 통신이 필요할 때 부적합 하다.

그리고 Scriptable Object 는 unity에서만 이를 해독할 수 있어 server쪽에서는 이를 받아서 해독할 수 없다.

(즉 server에서 주고받는 data가 아닌 client에서만 사용할 data만 사용해야 한다.)

Data만 관리하는 object인데 불구하고 용량이 크다.







참고

http://archive.fo/5Mifm#selection-1741.22-1741.47


'TOOL > Unity' 카테고리의 다른 글

Draw call / Batch  (0) 2019.03.11
Frame 고정값 셋팅  (0) 2019.03.11
Coroutine / IEnumerator / IEnumerable  (0) 2019.03.06
Unity CG / Boehm-Demer-Weiser / 점진적 GC  (0) 2019.03.05
Unity Heap Memory 구조  (0) 2019.03.05