使用 ScriptableObject 作配置文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mseol/article/details/82930360

ScriptableObject脚本化对象在unity项目中可以作为配置文件,也可以用来做存储,和xml等类似。因为是官方提供的数据类型,可视化编辑方面也十分优秀,使用频率还是非常高的。下面通过一个“多国语言配置”的例子,详细了解一下ScriptableObject。效果如图。

多国语言

Localization.cs

public class Localization : ScriptableObject
{
    public string title = "Language";
    public List<Content> list;

    void OnEnable()
    {
        if (list == null)
            list = new List<Content>();
    }

    public void Add(Content content)
    {
        list.Add(content);
    }

    public void Remove(Content content)
    {
        list.Remove(content);
    }

    public void RemoveAt(int index)
    {
        list.RemoveAt(index);
    }
}

[System.Serializable]
public class Content
{
    public string en;
    public string cn;
    public string jp;
}

public class CreateScriptableObject : Editor
{
    public static void CreateAsset<Type>() where Type : ScriptableObject
    {
        Type item = ScriptableObject.CreateInstance<Type>();

        string root = Application.dataPath + "/Resources";
        if (!Directory.Exists(root))
        {
            Directory.CreateDirectory(root);
        }
        string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Resources/" + typeof(Type) + ".asset");

        AssetDatabase.CreateAsset(item, path);
        AssetDatabase.SaveAssets();

        EditorUtility.FocusProjectWindow();
        Selection.activeObject = item;
    }

    [MenuItem("Assets/Create/CreateLocalization")]
    public static void CreateLocalization()
    {
        CreateAsset<Localization>();
    }
}

Translate.cs

public class Translate : MonoBehaviour
{
    Localization languages;
    [SerializeField] List<Toggle> toggles;
    [SerializeField] List<Text> textList;

    void Awake()
    {
        languages = Resources.Load<Localization>("Localization");

        for (int i = 0; i < toggles.Count; i++)
        {
            int id = i;
            toggles[i].onValueChanged.AddListener((bool value) => OnToggleClick(id, value));
        }
    }

    void Start()
    {
        OnToggleClick(0, true);
    }

    void OnToggleClick(int id, bool value)
    {
        if (value)
        {
            //Debug.Log(id.ToString() + ":" + value);
            switch (id)
            {
                case 0: //en
                    for (int i = 0; i < textList.Count; i++)
                    {
                        textList[i].text = languages.list[i].en;
                    }
                    break;
                case 1: //cn
                    for (int i = 0; i < textList.Count; i++)
                    {
                        textList[i].text = languages.list[i].cn;
                    }
                    break;
                case 2: //jp
                    for (int i = 0; i < textList.Count; i++)
                    {
                        textList[i].text = languages.list[i].jp;
                    }
                    break;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/mseol/article/details/82930360