Insanely huge initial commit

This commit is contained in:
2026-02-21 17:04:05 -08:00
parent 9cdd36191a
commit 613d75914a
22525 changed files with 4035207 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 29d194b8b13778e45804273f1fae56ac
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fc1e205e58a1dd6409570b36d1584cbc
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TinySaveAPI.Test
{
// ----------------------------------------------------------------------------
/// <summary>
/// A sample class that we serialise, and then deserialise in our examples.
/// </summary>
/// <remarks>
/// See https://docs.unity3d.com/Manual/script-Serialization.html for more information on Unity Serialization.
/// See https://docs.microsoft.com/en-us/dotnet/standard/serialization/binary-serialization for more information on Binary Serialization.
/// </remarks>
[Serializable]
public class TestDataClassAdvanced
{
public int TestInteger = 111;
public float TestFloat = 222.2f;
public string TestString = "TestDataClass String";
// Properties can be serialised if using SerializationType.Binary. JsonUtility unfortunately ignores properties.
public string TestStringProperty { get; set; }
//JsonUtility unfortunately ignores Dictionaries.
public Dictionary<string, string> dictionary = new Dictionary<string, string>
{
[ "a" ] = "aaa",
[ "b" ] = "bbb"
};
// Both Binary and JsonUtility serialisation works with List<T>.
public List<string> TestList = new List<string> { "a", "b", "c" };
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 34542d607941fb7488123e0c9a66d167
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,239 @@
// An advacned example to demonstrate using the TineySaveAPI.
//
// Even though there's quite a lot of code below, for the most part, it boilds down to
// these two lines:
//
// var saveResult = await TinySave.SaveAsync ( dataName, d, SerializationType.Binary );
// and
// var loadResult = await TinySave.LoadAsync<T> ( dataName, SerializationType.Binary );
//
using System;
using System.Collections.Generic;
using UnityEngine;
// Include TinySaveAPI se we can use the api methods.
using TinySaveAPI;
using UnityEngine.UI;
namespace TinySaveAPI.Test
{
/// <summary>
/// A component that has a few methods demonstrating the use of TinySaveAPI.
/// </summary>
public class TinySaveTestAdvanced : MonoBehaviour
{
// ----------------------------------------------------------------------------
public Text Result;
// A prvate string marked with the attrite, demonstrating the ability to (de)serialise MonoBehaviours.
[SerializeField] private string TestString = "TinySaveTester MonoBehaviour String";
private const string dataName = "Dummy Data";
private string key;
// ----------------------------------------------------------------------------
void Start ( )
{
key = ( ( uint ) dataName.GetHashCode ( ) ).ToString ( );
Debug.Log ( $"Application.persistentDataPath and file : {Application.persistentDataPath}/{key}.dat\n(if saving to file)" );
}
/// <summary>
/// Demonstrate saving a general class object as Json.
/// </summary>
public async void SaveNonUnityObject ( )
{
var i = 0;
var d = new TestDataClassAdvanced ( ) { TestString = "String Data Before Save.", TestStringProperty = "123" };
var resultString =
$"{++i}. Save Non-Unity Object Started.\n" +
$"{++i}. Create New DummyData Object.\n DummyData.TestString = \"{d.TestString}\"\n" +
$"{++i}. Call TinySave.SaveAsync ( \"{dataName}\", {d.GetType ( ).Name})\n";
// This is the only important line of code to save an object.
var saveResult = await TinySave.SaveAsync ( dataName, d, SerializationType.Json );
resultString += $"{++i}. Returned Response : {saveResult}\n";
// Check the returned result of the SaveAsync call using a specific Enum.
if ( saveResult != Response.Success )
{
Result.text = resultString;
return;
}
d.TestString = "String Data AFTER Save.";
d.TestStringProperty = "456";
resultString += $"{++i}. Modify DummyData.TestString = \"{d.TestString}\"\n";
Result.text = resultString;
}
/// <summary>
/// Demonstrate loading a previously saved general class object from Json.
/// </summary>
public async void LoadNonUnityObject ( )
{
var i = 0;
var resultString =
$"{++i}. Load Non-Unity Object Started.\n" +
$"{++i}. TinySave.LoadAsync<DummyData> ( \"{dataName}\" )\n";
// This is the only important line of code to load an object.
(Response response, TestDataClassAdvanced testData) loadResult = await TinySave.LoadAsync<TestDataClassAdvanced> ( dataName, SerializationType.Json );
resultString += $"{++i}. Returned Response : {loadResult.response}\n";
// Check if the saveResult is a specific enum.
// Check for failure using Enum.HasFlag.
if ( loadResult.response.HasFlag ( Response.Failure ) )
{
Result.text = resultString;
return;
}
resultString += $"{++i}. Loaded Object String : \"{loadResult.testData.TestString}\"\n";
Result.text = resultString;
}
/// <summary>
/// Demonstrate saving a dictionary, modifying the local dicitionary item, then reloading that dictionary data again.
/// </summary>
public async void DictionaryExample ( )
{
var i = 0;
Dictionary<string, string> dictionary = new Dictionary<string, string>
{
[ "a" ] = "aaa",
[ "b" ] = "bbb"
};
var resultString =
$"{++i}. Save Dictionary<string, string> Started.\n" +
$"{++i}. Two dictionary items. dictionary[\"a\"] = {dictionary [ "a" ]}. dictionary[\"b\"] = {dictionary [ "b" ]}\n" +
$"{++i}. Call TinySave.SaveAsync ( \"{dataName}\", dictionary, SerializationType.Binary)\n";
// This is the only important line of code to save an object.
var saveResult = await TinySave.SaveAsync ( dataName, dictionary, SerializationType.Binary );
resultString += $"{++i}. Returned Response : {saveResult}\n";
// Check the returned result of the SaveAsync call using Enum.HasFlag.
if ( !saveResult.HasFlag ( Response.Success ) )
{
Result.text = resultString;
return;
}
dictionary [ "a" ] = "xxx";
dictionary [ "b" ] = "yyy";
resultString += $"{++i}. Modify dictionary items. dictionary[\"a\"] = {dictionary [ "a" ]}. dictionary[\"b\"] = {dictionary [ "b" ]}\n";
resultString += $"{++i}. Load Dictionary<string, string> Started.\n" +
$"{++i}. Call TinySave.LoadAsync<Dictionary<string, string>> ( \"{dataName}\", SerializationType.Binary )\n";
// This is the only important line of code to load an object.
var load = await TinySave.LoadAsync<Dictionary<string, string>> ( dataName, SerializationType.Binary );
resultString += $"{++i}. Returned Response : {load.Item1}\n";
// Check the returned result of the LoadAsync call using Enum.HasFlag.
if ( !load.Item1.HasFlag ( Response.Success ) )
{
Result.text = resultString;
return;
}
dictionary = load.Item2;
if ( load.Item2 == null )
resultString += $"{++i}. Item returned is null!\n";
else
resultString += $"{++i}. Reread dictionary items. dictionary[\"a\"] = {dictionary [ "a" ]}. dictionary[\"b\"] = {dictionary [ "b" ]}";
Result.text = resultString;
}
/// <summary>
/// Demonstrate saving a MonoBehaviour object as Json.
/// </summary>
public async void SaveMonoBehaviour ( )
{
var i = 0;
var resultString =
$"{++i}. Save MonoBehaviour Started.\n" +
$"{++i}. Using 'this' ({GetType ( ).Name}) Object.\n {GetType ( ).Name}.TestString = \"{TestString}\"\n" +
$"{++i}. Call TinySave.SaveAsync ( \"{dataName}\", {GetType ( ).Name}, SerializationType.Json ))\n";
// This is the only important line of code to save a MonoBehaviour (or ScriptableObject).
var saveResult = await TinySave.SaveAsync ( dataName, this, SerializationType.JsonEncrypted );
resultString += $"{++i}. Returned Response : {saveResult}\n";
// Use bitwise arithmetic to check for failure.
if ( ( saveResult & Response.Failure ) == Response.Failure )
{
Result.text = resultString;
return;
}
TestString = "String Data AFTER Save.";
resultString += $"{++i}. Modify {GetType ( ).Name}.TestString = \"{TestString}\"\n";
Result.text = resultString;
}
/// <summary>
/// Demonstrate filling an instance of a MonoBehaviour object with data read as Json.
/// </summary>
public async void LoadMonoBehaviour ( )
{
var i = 0;
var resultString =
$"{++i}. Load MonoBehaviour Started.\n" +
$"{++i}. Using 'this' Object.\n {GetType ( ).Name}.TestString = \"{TestString}\"\n" +
$"{++i}. Call TinySave.LoadAsync ( \"{dataName}\", {GetType ( ).Name}, SerializationType.Json ))\n";
var loadResult = await TinySave.LoadAsync<TinySaveTestAdvanced> ( dataName, this, SerializationType.JsonEncrypted );
resultString += $"{++i}. Returned Response : {loadResult}\n";
// Use bitwise arithmetic to check for failure.
if ( ( loadResult & Response.Failure ) == Response.Failure )
{
Result.text = resultString;
return;
}
resultString += $"{++i}. Reloaded String \"{TestString}\".\n";
Result.text = resultString;
}
private void OnDestroy ( )
{
CleanPlayerPrefs ( key );
}
/// <summary>
/// Clear any PlayerPrefs that might have been created during this demonstration.
/// </summary>
void CleanPlayerPrefs ( string key )
{
// Clean up the PlayerPrefs item if found
if ( PlayerPrefs.HasKey ( key ) )
{
Debug.Log ( $"Deleting PlayerPrefs {key}. {PlayerPrefs.GetString ( key )}" );
PlayerPrefs.DeleteKey ( key );
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5c973e7d795cad94da30d2b6aeebc29a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: bcc08665330a6bd47be50a7a2d7b1aea
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: accab5fbdbf879346b3d220c17654b06
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,20 @@
using System;
namespace TinySaveAPI.Test
{
// ----------------------------------------------------------------------------
/// <summary>
/// A sample class that we serialise, and then deserialise in our examples.
/// </summary>
/// <remarks>
/// See https://docs.unity3d.com/Manual/script-Serialization.html for more information on Unity Serialization.
/// See https://docs.microsoft.com/en-us/dotnet/standard/serialization/binary-serialization for more information on Binary Serialization.
/// </remarks>
[Serializable]
public class PlayerData
{
public string Name;
public int Lives;
public int Health;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c336054e375d44d4b9928d8a79246780
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,968 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 0
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 11
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings:
serializedVersion: 10
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 512
m_PVRBounces: 2
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVRFilteringMode: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ShowResolutionOverlay: 1
m_LightingDataAsset: {fileID: 0}
m_UseShadowmask: 1
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 2
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &59679092
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 59679093}
- component: {fileID: 59679095}
- component: {fileID: 59679094}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &59679093
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 59679092}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1319676010}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 15, y: 0}
m_SizeDelta: {x: -30, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &59679094
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 59679092}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_RaycastTarget: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 26
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 0
m_MaxSize: 40
m_Alignment: 3
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: 2. LOAD DATA
--- !u!222 &59679095
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 59679092}
m_CullTransparentMesh: 0
--- !u!1 &797695087
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 797695088}
- component: {fileID: 797695090}
- component: {fileID: 797695089}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &797695088
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 797695087}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1718910329}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 15, y: 0}
m_SizeDelta: {x: -30, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &797695089
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 797695087}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_RaycastTarget: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 26
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 0
m_MaxSize: 40
m_Alignment: 3
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: 1. SAVE DATA
--- !u!222 &797695090
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 797695087}
m_CullTransparentMesh: 0
--- !u!1 &800553277
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 800553279}
- component: {fileID: 800553278}
m_Layer: 0
m_Name: Main Camera
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!20 &800553278
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 800553277}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 2
m_BackGroundColor: {r: 0.20785868, g: 0.22608136, b: 0.254717, a: 0}
m_projectionMatrixMode: 1
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_GateFitMode: 2
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 60
orthographic: 0
orthographic size: 5
m_Depth: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &800553279
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 800553277}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1164985465
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1164985466}
- component: {fileID: 1164985468}
- component: {fileID: 1164985467}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1164985466
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1164985465}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1710405677}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -40, y: -40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1164985467
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1164985465}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 28
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 0
m_MaxSize: 40
m_Alignment: 0
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Result Text
--- !u!222 &1164985468
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1164985465}
m_CullTransparentMesh: 0
--- !u!1 &1319676009
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1319676010}
- component: {fileID: 1319676013}
- component: {fileID: 1319676012}
- component: {fileID: 1319676011}
m_Layer: 5
m_Name: Load Data
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1319676010
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1319676009}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 59679093}
m_Father: {fileID: 1873335676}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 30, y: -80}
m_SizeDelta: {x: 900, y: 60}
m_Pivot: {x: 0, y: 1}
--- !u!114 &1319676011
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1319676009}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 1319676012}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 2123090986}
m_MethodName: LoadData
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null
--- !u!114 &1319676012
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1319676009}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
--- !u!222 &1319676013
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1319676009}
m_CullTransparentMesh: 0
--- !u!1 &1491946377
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1491946380}
- component: {fileID: 1491946379}
- component: {fileID: 1491946378}
m_Layer: 0
m_Name: EventSystem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1491946378
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1491946377}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical
m_SubmitButton: Submit
m_CancelButton: Cancel
m_InputActionsPerSecond: 10
m_RepeatDelay: 0.5
m_ForceModuleActive: 0
--- !u!114 &1491946379
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1491946377}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_FirstSelected: {fileID: 0}
m_sendNavigationEvents: 1
m_DragThreshold: 10
--- !u!4 &1491946380
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1491946377}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1710405676
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1710405677}
- component: {fileID: 1710405679}
- component: {fileID: 1710405678}
m_Layer: 5
m_Name: Result
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1710405677
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1710405676}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1164985466}
m_Father: {fileID: 1873335676}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -20, y: -20}
m_SizeDelta: {x: 900, y: -40}
m_Pivot: {x: 1, y: 1}
--- !u!114 &1710405678
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1710405676}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 0.392}
m_RaycastTarget: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
--- !u!222 &1710405679
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1710405676}
m_CullTransparentMesh: 0
--- !u!1 &1718910328
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1718910329}
- component: {fileID: 1718910332}
- component: {fileID: 1718910331}
- component: {fileID: 1718910330}
m_Layer: 5
m_Name: Save Data
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1718910329
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1718910328}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 797695088}
m_Father: {fileID: 1873335676}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 30, y: -20}
m_SizeDelta: {x: 900, y: 60}
m_Pivot: {x: 0, y: 1}
--- !u!114 &1718910330
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1718910328}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 1718910331}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 2123090986}
m_MethodName: SaveData
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null
--- !u!114 &1718910331
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1718910328}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
--- !u!222 &1718910332
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1718910328}
m_CullTransparentMesh: 0
--- !u!1 &1873335672
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1873335676}
- component: {fileID: 1873335675}
- component: {fileID: 1873335674}
- component: {fileID: 1873335673}
m_Layer: 5
m_Name: Canvas
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1873335673
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1873335672}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 1
m_BlockingObjects: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!114 &1873335674
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1873335672}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 1920, y: 1080}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
--- !u!223 &1873335675
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1873335672}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 0
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 0
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_AdditionalShaderChannelsFlag: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
--- !u!224 &1873335676
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1873335672}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0, y: 0, z: 0}
m_Children:
- {fileID: 1718910329}
- {fileID: 1319676010}
- {fileID: 1710405677}
m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0}
--- !u!1 &2123090985
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2123090987}
- component: {fileID: 2123090986}
m_Layer: 0
m_Name: TinySaveTester
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &2123090986
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2123090985}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 285e6c8e64e126d4faaa1f08c57f0019, type: 3}
m_Name:
m_EditorClassIdentifier:
Result: {fileID: 1164985467}
--- !u!4 &2123090987
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2123090985}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7069c7d606a0f974cab47ad97a984648
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,85 @@
// A simple example to demonstrate using the TineySaveAPI.
//
// The important lines are:
// var saveResult = await TinySave.SaveAsync ( dataName, d, SerializationType.Binary );
// and
// var loadResult = await TinySave.LoadAsync<T> ( dataName, SerializationType.Binary );
//
using System;
using System.Collections.Generic;
using UnityEngine;
// Include TinySaveAPI se we can use the api methods.
using TinySaveAPI;
using UnityEngine.UI;
namespace TinySaveAPI.Test
{
/// <summary>
/// A component that demonstrates the simple use of TinySaveAPI.
/// </summary>
public class TinySaveTestSimple : MonoBehaviour
{
// ----------------------------------------------------------------------------
public Text Result;
private const string fileName = "Player.dat";
// ----------------------------------------------------------------------------
void Start ( )
{
Debug.Log ( $"Application.persistentDataPath and file : {Application.persistentDataPath}/{fileName}" );
}
/// <summary>
/// Demonstrate saving a PlayerData object.
/// </summary>
public async void SaveData ( )
{
var i = 0;
var playerData = new PlayerData ( )
{
Name = "Player1 Name",
Health = 100,
Lives = 3
};
var resultString =
$"{++i}. Save Data Started.\n" +
$"{++i}. Call TinySave.SaveAsync ( \"{fileName}\", {playerData.GetType ( ).Name})\n";
// This is the only important line of code to save an object.
var saveResult = await TinySave.SaveAsync ( fileName, playerData, SerializationType.Binary );
resultString += $"{++i}. Returned Response : {saveResult}\n";
Result.text = resultString;
}
/// <summary>
/// Demonstrate loading a previously saved PlayerData object.
/// </summary>
public async void LoadData ( )
{
var i = 0;
var resultString =
$"{++i}. Load Object Started.\n" +
$"{++i}. TinySave.LoadAsync<DummyData> ( \"{fileName}\" )\n";
// This is the only important line of code to load an object.
var loadResult = await TinySave.LoadAsync<PlayerData> ( fileName, SerializationType.Binary );
// We can now se loadResult.response and loadResult.item.
resultString += $"{++i}. Returned Response : {loadResult.response}\n";
if ( loadResult.response.HasFlag ( Response.Success ) )
resultString += $"{++i}. Loaded Data Name : \"{loadResult.item.Name}\"\n";
Result.text = resultString;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 285e6c8e64e126d4faaa1f08c57f0019
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: bcc4f3a4e1849cb45b75cfb528188113
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,19 @@
namespace TinySaveAPI
{
using System.Diagnostics;
static class Logger
{
[Conditional ( "UNITY_EDITOR" )]
public static void Log ( string logMsg )
{
UnityEngine.Debug.Log ( logMsg );
}
[Conditional ( "UNITY_EDITOR" )]
public static void LogWarning ( string logMsg )
{
UnityEngine.Debug.LogWarning ( logMsg );
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 417aa130a5e469445adaffde1e71a0aa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,22 @@
using System;
namespace TinySaveAPI
{
/// <summary>
/// The enum returned by the API methods indicating the success or failuer of the operation.
/// </summary>
[Flags]
public enum Response
{
None = 0,
Success = 1 << 0,
Failure = 1 << 2,
Empty = Failure | 1 << 10,
FileNotFound = Failure | 1 << 11,
InvalidParameter = Failure | 1 << 12,
Exception = Failure | 1 << 13,
UnableToSerialise = Failure | 1 << 14,
UnableToDeserialise = Failure | 1 << 15
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1fc6e0ca4281e2d409956139d4a76624
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,13 @@
namespace TinySaveAPI
{
/// <summary>
/// Enums defining the types of serialisation available to the developer.
/// </summary>
public enum SerializationType
{
None = 0,
Binary,
Json,
JsonEncrypted
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ae2d600f0e1785f438f7410b510ba715
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,385 @@
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using Debug = TinySaveAPI.Logger;
namespace TinySaveAPI
{
public static class TinySave
{
// ---------------------------------------------------------------------------- Static Variables and Properties
// The security key has to be either 16 or 24 characters in length.
public static string SecurityKey { get; set; } = "Security Key... Change!!";
public static SerializationType SerializationType { get; set; } = SerializationType.Binary;
public static bool IsWebGL =>
#if UNITY_WEBGL
true;
#else
false;
#endif
public static bool IsDebug
{ get; set; } =
#if DEBUG
true;
#else
false;
#endif
// ---------------------------------------------------------------------------- Private Variables
private static BinaryFormatter binaryFormatter;
// ---------------------------------------------------------------------------- Static Methods
/// <summary>
/// Create a new item T from the serialised data.
/// </summary>
/// <typeparam name="T">A class or struct. Cannot be a UnityEngine.Object, e.g. GameObject or ScriptableObject.</typeparam>
/// <param name="name">The name of the item you wish to load. Must match exactly the name that was used to serialise the data.</param>
/// <param name="serializationOverride">An optional serialisation type override.</param>
/// <returns>A Tuple containing an operation success Response and the newly created (T)Item.</returns>
public static async Task<(Response response, T item)> LoadAsync<T> ( string name, SerializationType serializationOverride = SerializationType.None )
{
if ( !typeof ( T ).IsSerializable )
{
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\" ) {typeof ( T ).Name} is not Serializable!" );
return (Response.InvalidParameter, default);
}
if ( typeof ( T ).IsAssignableFrom ( typeof ( UnityEngine.Object ) ) )
{
// We can't create "new" UnityEngine Objects.
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\" ). Cannot deserialize to a new UnityEngine.Object." );
return (Response.InvalidParameter, default);
}
if ( serializationOverride == SerializationType.None ) serializationOverride = SerializationType;
byte [ ] result;
int bytesRead = 0;
if ( IsWebGL )
{
if ( serializationOverride != SerializationType.Binary )
{
serializationOverride = SerializationType.Binary;
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\" ) Only Binary formatting supported for WebGL. No action required." );
}
var fileName = $"{( uint ) name.GetHashCode ( )}";
var base64String = PlayerPrefs.GetString ( fileName, string.Empty );
if ( string.IsNullOrEmpty ( base64String ) )
return (Response.Empty, default);
try
{
result = Convert.FromBase64String ( base64String );
}
catch ( Exception e )
{
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\" ) Exception caught.\n{e.Message}" );
return (Response.Exception, default);
}
bytesRead = result.Length;
}
else
{
if ( binaryFormatter == null ) binaryFormatter = new BinaryFormatter ( );
var fileName = $"{Application.persistentDataPath}/{( uint ) name.GetHashCode ( )}.dat";
if ( !File.Exists ( fileName ) )
{
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\" ) File Not Found : {fileName}" );
return (Response.FileNotFound, default);
}
using ( FileStream file = File.Open ( fileName, FileMode.Open, FileAccess.Read, FileShare.None ) )
{
result = new byte [ file.Length ];
bytesRead = await file.ReadAsync ( result, 0, ( int ) file.Length );
}
}
Debug.Log ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\" ) {bytesRead} bytes read." );
if ( bytesRead == 0 )
{
Debug.Log ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\" ) {bytesRead} bytes read." );
return (Response.Empty, default);
}
switch ( serializationOverride )
{
case SerializationType.Binary:
try
{
using ( MemoryStream stream = new MemoryStream ( result ) )
return (Response.Success, ( T ) binaryFormatter.Deserialize ( stream ) );
}
catch ( Exception e )
{
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\" ) [{serializationOverride}] Exception caught.\n{e.Message}" );
return (Response.Exception, default);
}
case SerializationType.JsonEncrypted:
case SerializationType.Json:
try
{
string jsonString = serializationOverride == SerializationType.JsonEncrypted ? Decrypt ( result ) : Encoding.UTF8.GetString ( result );
return (Response.Success, JsonUtility.FromJson<T> ( jsonString ));
}
catch ( Exception e )
{
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\" ) [{serializationOverride}] Exception caught.\n{e.Message}" );
return (Response.Exception, default);
}
}
return (Response.None, default);
}
/// <summary>
/// Fill a given instance of an object from the serialized data. This form of the method only accepts UnityEngine.Objects, and works with encrypted or unencrypted JSON.
/// </summary>
/// <typeparam name="T">A class that derives from UnityEngine.Object, e.g. GameObject or ScriptableObject.</typeparam>
/// <param name="name">The name of the item you wish to load. Must match exactly the name that was used to serialise the data.</param>
/// <param name="serializationOverride">An optional serialisation type override.</param>
/// <returns>A Response indicating whether or not the operation succeeded.</returns>
public static async Task<Response> LoadAsync<T> ( string name, T item, SerializationType serializationOverride = SerializationType.None ) where T : UnityEngine.Object
{
if ( serializationOverride == SerializationType.None ) serializationOverride = SerializationType;
if ( serializationOverride != SerializationType.Json && serializationOverride != SerializationType.JsonEncrypted )
{
serializationOverride = SerializationType.JsonEncrypted;
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\", {typeof ( T ).Name} ) Only Json or JsonEncrypted formatting supported for WebGL. No action required, defaulting to JsonEncrypted." );
}
if ( !typeof ( MonoBehaviour ).IsAssignableFrom ( typeof ( T ) ) && !typeof ( ScriptableObject ).IsAssignableFrom ( typeof ( T ) ) )
{
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\", {typeof ( T ).Name} ) Method requires either a MonoBehaviour or ScriptableObject." );
return Response.InvalidParameter;
}
byte [ ] result;
int bytesRead = 0;
string json = string.Empty;
if ( IsWebGL )
{
var fileName = $"{( uint ) name.GetHashCode ( )}";
json = PlayerPrefs.GetString ( fileName, string.Empty );
if ( json == string.Empty || json == "{}" ) return Response.Empty;
bytesRead = json.Length;
if ( serializationOverride == SerializationType.JsonEncrypted ) json = Decrypt ( Convert.FromBase64String ( json ) );
}
else
{
var fileName = $"{Application.persistentDataPath}/{( uint ) name.GetHashCode ( )}.dat";
if ( !File.Exists ( fileName ) )
{
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\", {typeof ( T ).Name} ) File Not Found : {fileName}" );
return Response.FileNotFound;
}
using ( FileStream file = File.Open ( fileName, FileMode.Open, FileAccess.Read, FileShare.None ) )
{
result = new byte [ file.Length ];
bytesRead = await file.ReadAsync ( result, 0, ( int ) file.Length );
}
if ( serializationOverride == SerializationType.JsonEncrypted ) json = Decrypt ( result );
}
if ( bytesRead == 0 )
{
Debug.Log ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\", {typeof ( T ).Name} ) {bytesRead} bytes read." );
return Response.Empty;
}
try
{
JsonUtility.FromJsonOverwrite ( json, item );
return Response.Success;
}
catch ( Exception e )
{
Debug.LogWarning ( $"[DEBUG] LoadAsync<{typeof ( T ).Name}> ( \"{name}\", {typeof ( T ).Name} ) [{serializationOverride}] Exception caught.\n\n{e.Message}" );
return Response.Exception;
}
}
/// <summary>
/// Save the supplied object, using the given name.
/// </summary>
/// <param name="name">The name used as the filename, or key if using PlayerPrefs (WebGL).</param>
/// <param name="obj">The object to be serialised.</param>
/// <param name="securityKeyOverride">If left null, uses the static SecurityKey value.</param>
/// <returns>A Response indicating whether or not the operation succeeded.</returns>
public static async Task<Response> SaveAsync ( string name, object obj, SerializationType serializationOverride = SerializationType.None )
{
if ( serializationOverride == SerializationType.None ) serializationOverride = SerializationType;
var objectType = obj.GetType ( );
if ( string.IsNullOrEmpty ( name ) || obj == null )
{
Debug.LogWarning ( $"[DEBUG] SaveAsync ( \"{name}\", {objectType.Name} ) [{serializationOverride}] name or object are empty/null." );
return Response.InvalidParameter;
}
if ( objectType.IsAssignableFrom ( typeof ( UnityEngine.Object ) ) && !objectType.IsSerializable )
{
Debug.LogWarning ( $"[DEBUG] SaveAsync ( \"{name}\", {objectType.Name} ) [{serializationOverride}] is not Serializable!" );
return Response.InvalidParameter;
}
var fileName = $"{( uint ) name.GetHashCode ( )}";
if ( !IsWebGL )
{
if ( binaryFormatter == null ) binaryFormatter = new BinaryFormatter ( );
fileName = $"{Application.persistentDataPath}/{fileName}.dat";
}
switch ( serializationOverride )
{
case SerializationType.Binary:
try
{
if ( IsWebGL )
{
using ( MemoryStream stream = new MemoryStream ( ) )
{
binaryFormatter.Serialize ( stream, obj );
PlayerPrefs.SetString ( fileName, Convert.ToBase64String ( stream.ToArray ( ) ) );
}
}
else
{
using ( FileStream file = File.Open ( fileName, FileMode.Create ) )
binaryFormatter.Serialize ( file, obj );
}
return Response.Success;
}
catch ( Exception e )
{
Debug.LogWarning ( $"[DEBUG] SaveAsync ( \"{name}\", {objectType.Name} ) [{serializationOverride}] Exception caught.\n\n{e.Message}" );
return Response.Exception;
}
case SerializationType.Json:
case SerializationType.JsonEncrypted:
try
{
var json = JsonUtility.ToJson ( obj );
if ( json == "{}" )
return Response.UnableToSerialise;
if ( IsWebGL )
{
if ( serializationOverride == SerializationType.JsonEncrypted ) json = Convert.ToBase64String ( Encrypt ( json ) );
PlayerPrefs.SetString ( fileName, json );
}
else
{
using ( FileStream file = File.Open ( fileName, FileMode.Create ) )
{
byte [ ] bytes = serializationOverride == SerializationType.JsonEncrypted ? Encrypt ( json ) : Encoding.UTF8.GetBytes ( json );
await file.WriteAsync ( bytes, 0, bytes.Length );
}
}
return Response.Success;
}
catch ( Exception e )
{
Debug.LogWarning ( $"[DEBUG] SaveAsync ( \"{name}\", {objectType.Name} ) [{serializationOverride}] Exception caught.\n\n{e.Message}" );
return Response.Exception;
}
}
return Response.Empty;
}
/// <summary>
/// Encrypt a string, using a security key, into a byte array.
/// </summary>
/// <param name="dataString">The string data to encrypt.</param>
/// <param name="securityKeyOverride">If left null, uses the static SecurityKey value.</param>
/// <returns>A byte array containing the encrypted string.</returns>
public static byte [ ] Encrypt ( string dataString, string securityKeyOverride = null )
{
if ( string.IsNullOrEmpty ( securityKeyOverride ) )
{
if ( SecurityKey == null ) return null;
securityKeyOverride = SecurityKey;
}
var keyArray = Encoding.UTF8.GetBytes ( securityKeyOverride );
var dataBytesArray = Encoding.UTF8.GetBytes ( dataString );
using ( var provider = new TripleDESCryptoServiceProvider
{
Key = keyArray,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
} )
{
using ( var encryptor = provider.CreateEncryptor ( ) )
{
var resultArray = encryptor.TransformFinalBlock ( dataBytesArray, 0, dataBytesArray.Length );
provider.Clear ( );
return resultArray;
}
}
}
/// <summary>
/// Decrypt a byte array, using a security key, into a string.
/// </summary>
/// <param name="dataBytesArray">The byte array containing the encrypted data.</param>
/// <param name="securityKeyOverride">If left null, uses the static SecurityKey value.</param>
/// <returns>A string containing the unencrypted data.</returns>
public static string Decrypt ( byte [ ] dataBytesArray, string securityKeyOverride = null )
{
if ( string.IsNullOrEmpty ( securityKeyOverride ) )
{
if ( SecurityKey == null ) return null;
securityKeyOverride = SecurityKey;
}
var keyArray = Encoding.UTF8.GetBytes ( securityKeyOverride );
using ( var provider = new TripleDESCryptoServiceProvider
{
Key = keyArray,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
} )
{
using ( var decryptor = provider.CreateDecryptor ( ) )
{
byte [ ] resultArray = decryptor.TransformFinalBlock ( dataBytesArray, 0, dataBytesArray.Length );
provider.Clear ( );
return Encoding.UTF8.GetString ( resultArray );
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b494ac3b0ae11d74386c2a01b429cded
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,55 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1001 &100100000
Prefab:
m_ObjectHideFlags: 1
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications: []
m_RemovedComponents: []
m_ParentPrefab: {fileID: 0}
m_RootGameObject: {fileID: 1212578944183026}
m_IsPrefabParent: 1
--- !u!1 &1212578944183026
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
serializedVersion: 5
m_Component:
- component: {fileID: 4433308502016048}
- component: {fileID: 114346437004212356}
m_Layer: 0
m_Name: TinySaveManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4433308502016048
Transform:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 1212578944183026}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &114346437004212356
MonoBehaviour:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 1212578944183026}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e992d168251972a4dbcb85ec562f75c0, type: 3}
m_Name:
m_EditorClassIdentifier:
SecurityKey: Security Key... Change!!
SerializationType: 1

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: dece676d16176934f9864bd17c92bbb8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 100100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,54 @@
using UnityEngine;
// Include TinySaveAPI so you can use the TinySave features.
using TinySaveAPI;
[DisallowMultipleComponent]
#if UNITY_2018_3_OR_NEWER
[ExecuteAlways]
#else
[ExecuteInEditMode]
#endif
public class TinySaveManagerComponent : MonoBehaviour
{
private static TinySaveManagerComponent singleton;
[Tooltip ( "The security key used to encrypt JSON data. Only required if saving as Encrytped JSON. Note: The key should be either 16 or 24 characters in length." )]
public string SecurityKey = "Security Key... Change!!";
[Tooltip ( "The default Serialization Type used." )]
public SerializationType SerializationType = SerializationType.Binary;
private void OnEnable ( )
{
var items = FindObjectsOfType<TinySaveManagerComponent> ( );
if ( items.Length == 1 )
{
singleton = this;
}
if ( singleton != this )
{
Debug.LogWarning ( $"An extra SaveItComponent has been found on GameObject \"{this.gameObject.name}\". This instance is being destryoed. Add only one TinySaveManager instance to your game." );
if ( Application.isEditor )
DestroyImmediate ( this );
else
Destroy ( this );
return;
}
TinySave.SecurityKey = SecurityKey;
TinySave.SerializationType = SerializationType;
}
private void OnValidate ( )
{
if ( SecurityKey.Length < 16 )
SecurityKey = SecurityKey.PadRight ( 16, ' ' );
else if ( SecurityKey.Length > 16 && SecurityKey.Length < 24 )
SecurityKey = SecurityKey.PadRight ( 24, ' ' );
else if ( SecurityKey.Length > 24 )
SecurityKey = SecurityKey.Substring ( 0, 24 );
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e992d168251972a4dbcb85ec562f75c0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: