Храним преднастройки удобно

Храним преднастройки удобно

Сообщение pod4444 27 июн 2013, 20:43

Предисловие

Привет. Я расскажу об относительно удобном способе хранения преднастроек. Отмечу, что сохранить изменения настроек в Game Runtime не получится.

Я давно делаю свое расширение для Unity, и удобное хранение настроек, их изменение меня конечно привлекает. Изначально я использовал обычную сериализацию, но позже решил попробовать следующий способ, который позволяют весь труд сериализации переложить на Unity.

Сабж

Для начала нам нужно создать класс унаследованный от ScriptableObject, чтобы хранить нужную нам информацию, например настройки логгера. Ниже приведен пример такого класса, с дополнительным сериализуемым классом:

NOTE: Все скрипты написаны отдельной библиотекой, потому используются пространства имен.

Синтаксис:
Используется csharp
namespace Orion
{
    using UnityEngine;
    using Aides;

    public sealed class OrionSettings : ScriptableObject
    {
        public AdjustSettings Debug = new AdjustSettings();
    }
}

namespace Orion.Aides
{
    [System.Serializable]
    public sealed class AdjustSettings
    {
        public bool Mode, ShowClassName;
        public string[] Filters = new string[1], Exceptions;
    }
}
 


Теперь нам нужно создать контроллер, который будет следить за наличием нашего файла, подпишемся на основные события, при которых наш файл может пропасть:

NOTE: Скрипт должен находится в папке Editor, а ассет в папке Resources

Синтаксис:
Используется csharp
namespace Orion.Editors
{
    using System.IO;
    using UnityEngine;
    using UnityEditor;

    [InitializeOnLoad]
    internal sealed class CoreController
    {
        static CoreController()
        {
            EditorApplication.projectWindowChanged += Check;
            EditorApplication.hierarchyWindowChanged += Check;
            EditorApplication.playmodeStateChanged += Check;
        }

        private static void Check()
        {
            var set = AssetDatabase.LoadAssetAtPath("Assets/Resources/OrionSettings.asset", typeof(OrionSettings)) as OrionSettings;
            if (set == null)
            {
                var path = Application.dataPath + "/Resources";
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                set = ScriptableObject.CreateInstance<OrionSettings>();
                //set.hideFlags = HideFlags.NotEditable;
                AssetDatabase.CreateAsset(set, "Assets/Resources/OrionSettings.asset");
                AssetDatabase.Refresh();
            }
        }
    }
}
 


Разремив строку с hideFlags, можно сделать ассет неизменяемым напрямую в редакторе и написать свой EditorWindow, получив возможность править настройки по-своему. Вдобавок hideFlags дает возможность скрыть ассет.

Теперь у нас есть ассет; который можно править прямо в Editor, Editor Runtime; выглядит он так:

Скрытый текст:
Изображение


Вот пример как можно использовать настройки:

Синтаксис:
Используется csharp
namespace Orion
{
    using UnityEngine;

    public sealed class CoreManager : MonoBehaviour
    {
        private OrionSettings Settings;

        private void Awake()
        {
            Settings = Resources.Load("OrionSettings") as OrionSettings;
        }

        private void OnGUI()
        {
            Settings.Debug.Mode = GUILayout.Toggle(Settings.Debug.Mode, "Debug");
        }
    }
}
 


NOTE: Отмечу, что все изменения в Editor Runtime, то есть после нажатия Play, сохраняются

В итоге мы получаем два способа загрузить наши настройки:
Синтаксис:
Используется csharp
Settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/OrionSettings.asset", typeof(OrionSettings)) as OrionSettings;
Settings = Resources.Load("OrionSettings") as OrionSettings;
 

Первый подойдет только для Editor, второй можно использовать везде.

Итоги

На этом все сложности окончены, и теперь мы имеем простой способ для создания удобных преднастроек.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Храним преднастройки удобно

Сообщение Glooger 11 сен 2013, 20:12

(3A4OT) Шикарно. Как ведь любую инфу можно хранить... Спасибо.
Аватара пользователя
Glooger
UNIт
 
Сообщения: 118
Зарегистрирован: 04 апр 2013, 08:40

Re: Храним преднастройки удобно

Сообщение [bm] 17 сен 2013, 08:19

Браво!!! \m/
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск


Вернуться в Tips & Tricks

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3