К основному контенту

Unity ScriptableObject


В Unity есть возможность создавать ScriptableObject. Зачастую это некий контейнер где удобно хранить данные. Он легче и не обладает избыточностью MonoBehaviour.



Создадим:

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

[System.Serializable]
public class OnePool2 : ScriptableObject
{
    [HideInInspector]
    public string myName;
    public List<OnePool2Element> elements;
}

Но чтобы создать сам объект для заполнения понадобиться создать скрипт для редактора.

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

public class OnePool2Asset
{
    [MenuItem("Window/PiTool/Create Pool2 Asset")]
    public static void CreateAsset()
    {
        OnePool2 asset = ScriptableObject.CreateInstance<OnePool2>();
        AssetDatabase.CreateAsset(asset, "Assets/Resources/Pool/pool.asset");
        AssetDatabase.SaveAssets();
        EditorUtility.FocusProjectWindow();
        Selection.activeObject = asset;
    }
}

Теперь чтобы загрузить можно использовать что то наподобие:

public static void LoadPool(string name)
    {
        if (!_isInitialized)
            Initialize();
        //Debug.Log("PIP Loading pool: " + name);
        if (_instance.GetPool(name) == null)
        {
            OnePool2 pool = Resources.Load(_path + name) as OnePool2;
            if (pool != null)
            {
                pool = Instantiate(pool) as OnePool2;
                pool.myName = name;
                _instance._pools.Add(pool);

                for (int i = 0; i < pool.elements.Count; ++i)
                    pool.elements[i].Initialize(_instance._myTransform);
            }
        }
    }

Комментарии