An interesting use of Scriptable Objects within Unity as demonstrated at Unite 2016.
Data Scriptable Object
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
[CreateAssetMenu]
public class DataScriptable : ScriptableObject {
public static string SavedSettingsPath
{
get
{
return System.IO.Path.Combine(Application.persistentDataPath, "settings.json");
}
}
private static DataScriptable _instance;
public static DataScriptable Instance
{
get
{
if (!_instance)
_instance = Resources.FindObjectsOfTypeAll<DataScriptable>().FirstOrDefault();
#if UNITY_EDITOR
if (!_instance)
InitializeFromDefault(UnityEditor.AssetDatabase.LoadAssetAtPath<DataScriptable>("Assets/Test game settings.asset"));
#endif
return _instance;
}
}
///
<summary>
/// Retrieves data from JSON format.
/// </summary>
/// <param name="path"></param>
public static void LoadFromJSON(string path)
{
if (!_instance)
DestroyImmediate(_instance);
JsonUtility.FromJsonOverwrite(System.IO.File.ReadAllText(path), _instance);
_instance.hideFlags = HideFlags.HideAndDontSave;
}
///
<summary>
/// Object instance constructor.
/// </summary>
/// <param name="settings"></param>
public static void InitializeFromDefault(DataScriptable settings)
{
if (_instance) DestroyImmediate(_instance);
_instance = Instantiate(settings);
_instance.hideFlags = HideFlags.HideAndDontSave;
}
///
<summary>
/// Store data to disk in JSON.
/// </summary>
/// <param name="path"></param>
public void SaveToJSON(string path)
{
Debug.LogFormat("Saving game settings to {0}", path);
System.IO.File.WriteAllText(path, JsonUtility.ToJson(this, true));
}
public static bool FileExists()
{
return System.IO.File.Exists(SavedSettingsPath);
}
}
Data Scriptable Manager
using UnityEngine;
using System.Collections;
public class DataScriptableManager : MonoBehaviour {
public DataScriptable dataTemplate;
// Use this for initialization
void Start () {
if (DataScriptable.FileExists())
DataScriptable.LoadFromJSON(DataScriptable.SavedSettingsPath);
else
DataScriptable.InitializeFromDefault(dataTemplate);
}
public void Play()
{
DataScriptable.Instance.SaveToJSON(DataScriptable.SavedSettingsPath);
InstanceScriptable.CreateFromSettings(DataScriptable.Instance);
}
}
Instanced Scriptable Object
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using UnityEngine;
using UnityEngine.Assertions;
[CreateAssetMenu]
public class InstanceScriptable : ScriptableObject {
public static InstanceScriptable _instance;
public static InstanceScriptable Instance
{
get
{
if (!_instance)
_instance = Resources.FindObjectsOfTypeAll<InstanceScriptable>().FirstOrDefault();
#if UNITY_EDITOR
if (!_instance)
CreateFromSettings(DataScriptable.Instance);
#endif
return _instance;
}
}
///
<summary>
/// Object instance constructor.
/// </summary>
/// <param name="settings"></param>
public static void CreateFromSettings(DataScriptable settings)
{
Assert.IsNotNull(settings);
_instance = CreateInstance<InstanceScriptable>();
_instance.hideFlags = HideFlags.HideAndDontSave;
}
}
