浏览代码

Added a SerializableScriptableObject to store asset GUID.

This replaces the previous serialization code. We can use the cached asset GUID to serialize assets to disk as well as load them through the Addressables system.
/UI
Bronson Zgeb 3 年前
当前提交
a45a7dd8
共有 20 个文件被更改,包括 28 次插入149 次删除
  1. 3
      UOP1_Project/Assets/ScriptableObjects/SaveSystem/SaveSystem.asset
  2. 2
      UOP1_Project/Assets/Scripts/BaseClasses/DescriptionBaseSO.cs
  3. 3
      UOP1_Project/Assets/Scripts/SaveSystem/SaveSystem.cs
  4. 7
      UOP1_Project/Assets/Scripts/SceneManagement/ScriptableObjects/LocationSO.cs
  5. 19
      UOP1_Project/Assets/Scripts/SaveSystem/SerializableScriptableObject.cs
  6. 3
      UOP1_Project/Assets/Scripts/SaveSystem/SerializableScriptableObject.cs.meta
  7. 18
      UOP1_Project/Assets/ScriptableObjects/SceneData/Locations/LocationDatabase.asset
  8. 8
      UOP1_Project/Assets/ScriptableObjects/SceneData/Locations/LocationDatabase.asset.meta
  9. 23
      UOP1_Project/Assets/Scripts/SaveSystem/ISaveable.cs
  10. 3
      UOP1_Project/Assets/Scripts/SaveSystem/ISaveable.cs.meta
  11. 20
      UOP1_Project/Assets/Scripts/SaveSystem/Database.cs
  12. 11
      UOP1_Project/Assets/Scripts/SaveSystem/Database.cs.meta
  13. 8
      UOP1_Project/Assets/Scripts/SaveSystem/Editor.meta
  14. 4
      UOP1_Project/Assets/Scripts/SaveSystem/IDesc.cs
  15. 11
      UOP1_Project/Assets/Scripts/SaveSystem/IDesc.cs.meta
  16. 1
      UOP1_Project/Assets/Scripts/SaveSystem/LocationDatabase.cs
  17. 11
      UOP1_Project/Assets/Scripts/SaveSystem/LocationDatabase.cs.meta
  18. 11
      UOP1_Project/Assets/Scripts/SaveSystem/Uuid.cs
  19. 11
      UOP1_Project/Assets/Scripts/SaveSystem/Uuid.cs.meta

3
UOP1_Project/Assets/ScriptableObjects/SaveSystem/SaveSystem.asset


m_EditorClassIdentifier:
locationDatabase: {fileID: 11400000, guid: 9abcccc3f16b8c54e984de463d147899, type: 2}
_loadLocation: {fileID: 11400000, guid: 00e3063edc5902e40832ea618644c597, type: 2}
_onSceneReady: {fileID: 11400000, guid: b729e40fc41dd8b4ea7aaf5c857f7186, type: 2}
_locationId: 47723aeb-1bae-48c7-a760-4d6339e4a68a
_locationId:

2
UOP1_Project/Assets/Scripts/BaseClasses/DescriptionBaseSO.cs


/// <summary>
/// Base class for ScriptableObjects that need a public description field.
/// </summary>
public class DescriptionBaseSO : ScriptableObject
public class DescriptionBaseSO : SerializableScriptableObject
{
[TextArea] public string description;
}

3
UOP1_Project/Assets/Scripts/SaveSystem/SaveSystem.cs


public class SaveSystem : ScriptableObject
{
public LocationDatabase locationDatabase;
[SerializeField] private LoadEventChannelSO _loadLocation = default;
public string saveFilename = "save.chop";

LocationSO locationSo = locationsToLoad[0] as LocationSO;
if (locationSo)
{
saveData._locationId = locationSo.DescId.uuid;
saveData._locationId = locationSo.SerializableGuid;
}
}

7
UOP1_Project/Assets/Scripts/SceneManagement/ScriptableObjects/LocationSO.cs


using UnityEngine;
using UnityEngine.Localization;
public class LocationSO : GameSceneSO, IDesc
public class LocationSO : GameSceneSO
[Header("Serialization")]
[SerializeField] Uuid uuid;
public Uuid DescId => uuid;
}

19
UOP1_Project/Assets/Scripts/SaveSystem/SerializableScriptableObject.cs


using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class SerializableScriptableObject : ScriptableObject
{
private string _serializableGuid;
public string SerializableGuid => _serializableGuid;
void OnValidate()
{
#if UNITY_EDITOR
var path = AssetDatabase.GetAssetPath(this);
_serializableGuid = AssetDatabase.AssetPathToGUID(path);
#endif
}
}

3
UOP1_Project/Assets/Scripts/SaveSystem/SerializableScriptableObject.cs.meta


fileFormatVersion: 2
guid: cfba650367f74698998618a4a140d696
timeCreated: 1613591825

18
UOP1_Project/Assets/ScriptableObjects/SceneData/Locations/LocationDatabase.asset


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a07abb7875a4fc945b9a7cf5212ed565, type: 3}
m_Name: LocationDatabase
m_EditorClassIdentifier:
_descs:
- {fileID: 11400000, guid: 2f386bbc670c05145834a0f9c7d55798, type: 2}
- {fileID: 11400000, guid: d102ba8fe3b291249aeb9de4b95c1904, type: 2}
- {fileID: 11400000, guid: 3902a4362b3a4fb4ab5ce5dcc07d8427, type: 2}

8
UOP1_Project/Assets/ScriptableObjects/SceneData/Locations/LocationDatabase.asset.meta


fileFormatVersion: 2
guid: 9abcccc3f16b8c54e984de463d147899
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

23
UOP1_Project/Assets/Scripts/SaveSystem/ISaveable.cs


using System.Collections.Generic;
public interface ISaveable
{
/// <summary>
/// <para>The function which needs to be subscribed to the <see cref="SaveSystem.AddToRegistryCallback"/></para>
/// Include it in a place which only gets executed once to avoid data duplication.<br/>
/// Like in OnEnable() function of Monobehaviour or ScriptableObject
/// </summary>
void AddToSaveRegistry(HashSet<ISaveable> registry);
/// <summary>
/// Pure virtual function for saving data to a save file.<br/>
/// This will comprise the serialization logic.
/// </summary>
void Serialize(Save saveFile);
/// <summary>
/// Pure virtual function for loading data from a save file.<br/>
/// This will comprise the deserialziation logic.
/// </summary>
void Deserialize(Save saveFile);
}

3
UOP1_Project/Assets/Scripts/SaveSystem/ISaveable.cs.meta


fileFormatVersion: 2
guid: ea156e29696b4339a873e00d168dd164
timeCreated: 1613415034

20
UOP1_Project/Assets/Scripts/SaveSystem/Database.cs


using System.Collections.Generic;
using UnityEngine;
public abstract class Database<T> : ScriptableObject where T : IDesc
{
[SerializeField] protected List<T> _descs = new List<T>();
public virtual object FindByUuid(string uuid)
{
foreach (var desc in _descs)
{
if (desc.DescId.uuid == uuid)
{
return desc;
}
}
return null;
}
}

11
UOP1_Project/Assets/Scripts/SaveSystem/Database.cs.meta


fileFormatVersion: 2
guid: 6f858bf525be0ea4986d5763b2261cb4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

8
UOP1_Project/Assets/Scripts/SaveSystem/Editor.meta


fileFormatVersion: 2
guid: 95e496228d41fe8438f7ab581da0999d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

4
UOP1_Project/Assets/Scripts/SaveSystem/IDesc.cs


public interface IDesc
{
Uuid DescId { get; }
}

11
UOP1_Project/Assets/Scripts/SaveSystem/IDesc.cs.meta


fileFormatVersion: 2
guid: 6331f8f1642080c41b7bd5867823fe23
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

1
UOP1_Project/Assets/Scripts/SaveSystem/LocationDatabase.cs


public class LocationDatabase : Database<LocationSO> { }

11
UOP1_Project/Assets/Scripts/SaveSystem/LocationDatabase.cs.meta


fileFormatVersion: 2
guid: a07abb7875a4fc945b9a7cf5212ed565
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

11
UOP1_Project/Assets/Scripts/SaveSystem/Uuid.cs


[System.Serializable]
public class Uuid
{
public string uuid;
public static Uuid Generate()
{
Uuid newUuid = new Uuid { uuid = System.Guid.NewGuid().ToString() };
return newUuid;
}
}

11
UOP1_Project/Assets/Scripts/SaveSystem/Uuid.cs.meta


fileFormatVersion: 2
guid: 212c6e5308f8ab845b25793c5ca1f413
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
正在加载...
取消
保存