Repository files navigation

Cloud Save

Cloud Save interface with implementations for the Unity Editor, Apple's Game Center and Google Play Games Services.

Future implementations might include Unity Gaming Services, Epic Online Services, Steam Cloud and Firebase Cloud Storage.

Note from gilzoide: since I work as a mobile game developer, iOS and Android support is enough for my needs. I will likely not work on the suggested future implementations in the mid term, unless this work is sponsored.

Features

  • Simple interface with async methods for fetching, loading, saving and deleting cloud save games
  • Single interface for all implementations, for easy multiplatform development
  • Supports the Unity Editor by saving files in the "Library/Gilzoide.CloudSave" folder
  • Supports macOS / iOS / tvOS / visionOS platforms using Game Center + iCloud
  • Supports Android platforms using Google Play Games Services

TODO

  • Store additional metadata in Game Center provider
  • Add support for choosing how to resolve conflicts between cloud saved games (current behavior is most recent is kept).
  • Add a way to automate Game Center / iCloud capabilities in XCode project

How to install

Either:

  • Use the openupm registry and install this package using the openupm-cli:
    openupm add com.gilzoide.cloud-save
    
  • Install using the Unity Package Manager with the following URL:
    https://github.com/gilzoide/unity-cloud-save.git#1.0.0-preview4
    
  • Clone this repository or download a snapshot of it directly inside your project's Assets or Packages folder.

Usage example

usingSystem.Collections.Generic;usingGilzoide.CloudSave;usingGilzoide.CloudSave.Providers;usingUnityEngine;publicclassMyCloudSaveBehaviour:MonoBehaviour{voidStart(){// 1. Instantiate the wanted cloud save provider implementation.ICloudSaveProvidercloudSaveProvider;
#if UNITY_EDITOR// 1.a The Editor provider stores files in the "Library/Gilzoide.CloudSave" folder.// This is not the folder one would usually store game save data, so it functions// as a "cloud save" folder even after you clear regular save files or PlayerPrefs.cloudSaveProvider=newEditorCloudSaveProvider();
#elif UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 1.b Android + Google Play Games Services provider.// Requires installing the Google Play Games plugin and setting it up first.// You need to define the `HAVE_GOOGLE_PLAY_GAMES` scripting symbol on Android.// Users must be logged in to Play Games for cloud save to work.cloudSaveProvider=newPlayGamesCloudSaveProvider();
#elif UNITY_STANDALONE_OSX||UNITY_IOS||UNITY_TVOS||UNITY_VISIONOS// 1.c Apple Game Center provider (macOS, iOS, tvOS, visionOS).// Requires defining the Game Center capability in XCode project.// Requires defining the iCloud capability with the "iCloud Documents"// checkbox enabled and an iCloud container configured in XCode.// Users must be logged in to Game Center and iCloud for cloud save to work.cloudSaveProvider=newGameCenterCloudSaveProvider();
#else
// 1.d The Dummy provider does nothing and exists for use in unsupported platforms.// Calling methods on it do not throw, but they also do not save anything.cloudSaveProvider=newDummyCloudSaveProvider();
#endif
#if UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 2. Activate Play Games as the current Social provider in Unity.// Alternativelly, use Play Games API directly instead of UnityEngine.SocialGooglePlayGames.PlayGamesPlatform.Activate();
#endif
// 3. Make sure user is logged in to Play Games / Game Center before using cloud save.// This is not required by the Editor implementation.if(Social.localUser.authenticated){DoSomethingWithCloudSave(cloudSaveProvider);}else{Social.localUser.Authenticate((success,message)=>{if(success){DoSomethingWithCloudSave(cloudSaveProvider);}else{Debug.LogError($"Social authenticate error: {message}");}});}}asyncvoidDoSomethingWithCloudSave(ICloudSaveProvidercloudSaveProvider){// 4. Check if cloud save is enabled before using cloud save functionality.// Some providers require logging in to a social account before using cloud save.// Providers will likely throw exceptions on operations when cloud save is not enabled.if(!cloudSaveProvider.IsCloudSaveEnabled){return;}// 5. Now do something with the cloud save providerList<ICloudSaveGameMetadata>savedGames=awaitcloudSaveProvider.FetchAllAsync();foreach(ICloudSaveGameMetadatasavedGameinsavedGames){Debug.Log($"Found saved game with name {savedGame.Name}");byte[]data=awaitcloudSaveProvider.LoadBytesAsync(savedGame);}awaitcloudSaveProvider.SaveTextAsync("SaveText","Sample text data");awaitcloudSaveProvider.SaveBytesAsync("SaveBytes",newbyte[]{1,2,3,4});awaitcloudSaveProvider.SaveJsonAsync("SaveJson",newVector3(1,2,3));stringsavedText=awaitcloudSaveProvider.LoadTextAsync("SaveText");byte[]savedBytes=awaitcloudSaveProvider.LoadBytesAsync("SaveBytes");Vector3savedJson=awaitcloudSaveProvider.LoadJsonAsync<Vector3>("SaveJson");awaitcloudSaveProvider.DeleteAsync("SaveText");}}

Game Center

  • Game Center is supported on macOS, iOS, tvOS and visionOS platforms.
  • You must add the Game Center capability to the XCode project.
  • You must add the iCloud capability to the XCode project. The "iCloud Documents" checkbox must be enabled and an iCloud container must be configured for the cloud save to work.
  • The user must be signed in to Game Center and have iCloud Drive enabled in their account for cloud save to work.
  • There is a known GameKit issue where saved games are not returned on the first run after a fresh install of the game. A workaround is to delay and retry FetchAllAsync several times before accepting that there really are no saved games. Do this before calling any of the load methods.

Google Play Games Services

  • Play Games is supported on Android platforms
  • You must install the Google Play Games plugin for Unity in your project. If you use an old version of the plugin that does not come with Assembly Definition files, create the Google.Play.Games asmdef in the plugin's root folder, as well as the Google.Play.Games.Editor editor-only asmdef on the plugin's "Editor" folder.
  • You must define the HAVE_GOOGLE_PLAY_GAMEScustom scripting symbol. This package needs this to avoid compilation errors when Google Play Games plugin is not installed.
  • The user must be signed in to Play Games for the cloud save to work

About

Cloud Save interface with implementations for Apple Game Center and Google Play Games

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Cloud Save

Cloud Save interface with implementations for the Unity Editor, Apple's Game Center and Google Play Games Services.

Future implementations might include Unity Gaming Services, Epic Online Services, Steam Cloud and Firebase Cloud Storage.

Note from gilzoide: since I work as a mobile game developer, iOS and Android support is enough for my needs. I will likely not work on the suggested future implementations in the mid term, unless this work is sponsored.

Features

  • Simple interface with async methods for fetching, loading, saving and deleting cloud save games
  • Single interface for all implementations, for easy multiplatform development
  • Supports the Unity Editor by saving files in the "Library/Gilzoide.CloudSave" folder
  • Supports macOS / iOS / tvOS / visionOS platforms using Game Center + iCloud
  • Supports Android platforms using Google Play Games Services

TODO

  • Store additional metadata in Game Center provider
  • Add support for choosing how to resolve conflicts between cloud saved games (current behavior is most recent is kept).
  • Add a way to automate Game Center / iCloud capabilities in XCode project

How to install

Either:

  • Use the openupm registry and install this package using the openupm-cli:
    openupm add com.gilzoide.cloud-save
    
  • Install using the Unity Package Manager with the following URL:
    https://github.com/gilzoide/unity-cloud-save.git#1.0.0-preview4
    
  • Clone this repository or download a snapshot of it directly inside your project's Assets or Packages folder.

Usage example

usingSystem.Collections.Generic;usingGilzoide.CloudSave;usingGilzoide.CloudSave.Providers;usingUnityEngine;publicclassMyCloudSaveBehaviour:MonoBehaviour{voidStart(){// 1. Instantiate the wanted cloud save provider implementation.ICloudSaveProvidercloudSaveProvider;
#if UNITY_EDITOR// 1.a The Editor provider stores files in the "Library/Gilzoide.CloudSave" folder.// This is not the folder one would usually store game save data, so it functions// as a "cloud save" folder even after you clear regular save files or PlayerPrefs.cloudSaveProvider=newEditorCloudSaveProvider();
#elif UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 1.b Android + Google Play Games Services provider.// Requires installing the Google Play Games plugin and setting it up first.// You need to define the `HAVE_GOOGLE_PLAY_GAMES` scripting symbol on Android.// Users must be logged in to Play Games for cloud save to work.cloudSaveProvider=newPlayGamesCloudSaveProvider();
#elif UNITY_STANDALONE_OSX||UNITY_IOS||UNITY_TVOS||UNITY_VISIONOS// 1.c Apple Game Center provider (macOS, iOS, tvOS, visionOS).// Requires defining the Game Center capability in XCode project.// Requires defining the iCloud capability with the "iCloud Documents"// checkbox enabled and an iCloud container configured in XCode.// Users must be logged in to Game Center and iCloud for cloud save to work.cloudSaveProvider=newGameCenterCloudSaveProvider();
#else
// 1.d The Dummy provider does nothing and exists for use in unsupported platforms.// Calling methods on it do not throw, but they also do not save anything.cloudSaveProvider=newDummyCloudSaveProvider();
#endif
#if UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 2. Activate Play Games as the current Social provider in Unity.// Alternativelly, use Play Games API directly instead of UnityEngine.SocialGooglePlayGames.PlayGamesPlatform.Activate();
#endif
// 3. Make sure user is logged in to Play Games / Game Center before using cloud save.// This is not required by the Editor implementation.if(Social.localUser.authenticated){DoSomethingWithCloudSave(cloudSaveProvider);}else{Social.localUser.Authenticate((success,message)=>{if(success){DoSomethingWithCloudSave(cloudSaveProvider);}else{Debug.LogError($"Social authenticate error: {message}");}});}}asyncvoidDoSomethingWithCloudSave(ICloudSaveProvidercloudSaveProvider){// 4. Check if cloud save is enabled before using cloud save functionality.// Some providers require logging in to a social account before using cloud save.// Providers will likely throw exceptions on operations when cloud save is not enabled.if(!cloudSaveProvider.IsCloudSaveEnabled){return;}// 5. Now do something with the cloud save providerList<ICloudSaveGameMetadata>savedGames=awaitcloudSaveProvider.FetchAllAsync();foreach(ICloudSaveGameMetadatasavedGameinsavedGames){Debug.Log($"Found saved game with name {savedGame.Name}");byte[]data=awaitcloudSaveProvider.LoadBytesAsync(savedGame);}awaitcloudSaveProvider.SaveTextAsync("SaveText","Sample text data");awaitcloudSaveProvider.SaveBytesAsync("SaveBytes",newbyte[]{1,2,3,4});awaitcloudSaveProvider.SaveJsonAsync("SaveJson",newVector3(1,2,3));stringsavedText=awaitcloudSaveProvider.LoadTextAsync("SaveText");byte[]savedBytes=awaitcloudSaveProvider.LoadBytesAsync("SaveBytes");Vector3savedJson=awaitcloudSaveProvider.LoadJsonAsync<Vector3>("SaveJson");awaitcloudSaveProvider.DeleteAsync("SaveText");}}

Game Center

  • Game Center is supported on macOS, iOS, tvOS and visionOS platforms.
  • You must add the Game Center capability to the XCode project.
  • You must add the iCloud capability to the XCode project. The "iCloud Documents" checkbox must be enabled and an iCloud container must be configured for the cloud save to work.
  • The user must be signed in to Game Center and have iCloud Drive enabled in their account for cloud save to work.
  • There is a known GameKit issue where saved games are not returned on the first run after a fresh install of the game. A workaround is to delay and retry FetchAllAsync several times before accepting that there really are no saved games. Do this before calling any of the load methods.

Google Play Games Services

  • Play Games is supported on Android platforms
  • You must install the Google Play Games plugin for Unity in your project. If you use an old version of the plugin that does not come with Assembly Definition files, create the Google.Play.Games asmdef in the plugin's root folder, as well as the Google.Play.Games.Editor editor-only asmdef on the plugin's "Editor" folder.
  • You must define the HAVE_GOOGLE_PLAY_GAMEScustom scripting symbol. This package needs this to avoid compilation errors when Google Play Games plugin is not installed.
  • The user must be signed in to Play Games for the cloud save to work

About

Cloud Save interface with implementations for Apple Game Center and Google Play Games

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Cloud Save

Cloud Save interface with implementations for the Unity Editor, Apple's Game Center and Google Play Games Services.

Future implementations might include Unity Gaming Services, Epic Online Services, Steam Cloud and Firebase Cloud Storage.

Note from gilzoide: since I work as a mobile game developer, iOS and Android support is enough for my needs. I will likely not work on the suggested future implementations in the mid term, unless this work is sponsored.

Features

  • Simple interface with async methods for fetching, loading, saving and deleting cloud save games
  • Single interface for all implementations, for easy multiplatform development
  • Supports the Unity Editor by saving files in the "Library/Gilzoide.CloudSave" folder
  • Supports macOS / iOS / tvOS / visionOS platforms using Game Center + iCloud
  • Supports Android platforms using Google Play Games Services

TODO

  • Store additional metadata in Game Center provider
  • Add support for choosing how to resolve conflicts between cloud saved games (current behavior is most recent is kept).
  • Add a way to automate Game Center / iCloud capabilities in XCode project

How to install

Either:

  • Use the openupm registry and install this package using the openupm-cli:
    openupm add com.gilzoide.cloud-save
    
  • Install using the Unity Package Manager with the following URL:
    https://github.com/gilzoide/unity-cloud-save.git#1.0.0-preview4
    
  • Clone this repository or download a snapshot of it directly inside your project's Assets or Packages folder.

Usage example

usingSystem.Collections.Generic;usingGilzoide.CloudSave;usingGilzoide.CloudSave.Providers;usingUnityEngine;publicclassMyCloudSaveBehaviour:MonoBehaviour{voidStart(){// 1. Instantiate the wanted cloud save provider implementation.ICloudSaveProvidercloudSaveProvider;
#if UNITY_EDITOR// 1.a The Editor provider stores files in the "Library/Gilzoide.CloudSave" folder.// This is not the folder one would usually store game save data, so it functions// as a "cloud save" folder even after you clear regular save files or PlayerPrefs.cloudSaveProvider=newEditorCloudSaveProvider();
#elif UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 1.b Android + Google Play Games Services provider.// Requires installing the Google Play Games plugin and setting it up first.// You need to define the `HAVE_GOOGLE_PLAY_GAMES` scripting symbol on Android.// Users must be logged in to Play Games for cloud save to work.cloudSaveProvider=newPlayGamesCloudSaveProvider();
#elif UNITY_STANDALONE_OSX||UNITY_IOS||UNITY_TVOS||UNITY_VISIONOS// 1.c Apple Game Center provider (macOS, iOS, tvOS, visionOS).// Requires defining the Game Center capability in XCode project.// Requires defining the iCloud capability with the "iCloud Documents"// checkbox enabled and an iCloud container configured in XCode.// Users must be logged in to Game Center and iCloud for cloud save to work.cloudSaveProvider=newGameCenterCloudSaveProvider();
#else
// 1.d The Dummy provider does nothing and exists for use in unsupported platforms.// Calling methods on it do not throw, but they also do not save anything.cloudSaveProvider=newDummyCloudSaveProvider();
#endif
#if UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 2. Activate Play Games as the current Social provider in Unity.// Alternativelly, use Play Games API directly instead of UnityEngine.SocialGooglePlayGames.PlayGamesPlatform.Activate();
#endif
// 3. Make sure user is logged in to Play Games / Game Center before using cloud save.// This is not required by the Editor implementation.if(Social.localUser.authenticated){DoSomethingWithCloudSave(cloudSaveProvider);}else{Social.localUser.Authenticate((success,message)=>{if(success){DoSomethingWithCloudSave(cloudSaveProvider);}else{Debug.LogError($"Social authenticate error: {message}");}});}}asyncvoidDoSomethingWithCloudSave(ICloudSaveProvidercloudSaveProvider){// 4. Check if cloud save is enabled before using cloud save functionality.// Some providers require logging in to a social account before using cloud save.// Providers will likely throw exceptions on operations when cloud save is not enabled.if(!cloudSaveProvider.IsCloudSaveEnabled){return;}// 5. Now do something with the cloud save providerList<ICloudSaveGameMetadata>savedGames=awaitcloudSaveProvider.FetchAllAsync();foreach(ICloudSaveGameMetadatasavedGameinsavedGames){Debug.Log($"Found saved game with name {savedGame.Name}");byte[]data=awaitcloudSaveProvider.LoadBytesAsync(savedGame);}awaitcloudSaveProvider.SaveTextAsync("SaveText","Sample text data");awaitcloudSaveProvider.SaveBytesAsync("SaveBytes",newbyte[]{1,2,3,4});awaitcloudSaveProvider.SaveJsonAsync("SaveJson",newVector3(1,2,3));stringsavedText=awaitcloudSaveProvider.LoadTextAsync("SaveText");byte[]savedBytes=awaitcloudSaveProvider.LoadBytesAsync("SaveBytes");Vector3savedJson=awaitcloudSaveProvider.LoadJsonAsync<Vector3>("SaveJson");awaitcloudSaveProvider.DeleteAsync("SaveText");}}

Game Center

  • Game Center is supported on macOS, iOS, tvOS and visionOS platforms.
  • You must add the Game Center capability to the XCode project.
  • You must add the iCloud capability to the XCode project. The "iCloud Documents" checkbox must be enabled and an iCloud container must be configured for the cloud save to work.
  • The user must be signed in to Game Center and have iCloud Drive enabled in their account for cloud save to work.
  • There is a known GameKit issue where saved games are not returned on the first run after a fresh install of the game. A workaround is to delay and retry FetchAllAsync several times before accepting that there really are no saved games. Do this before calling any of the load methods.

Google Play Games Services

  • Play Games is supported on Android platforms
  • You must install the Google Play Games plugin for Unity in your project. If you use an old version of the plugin that does not come with Assembly Definition files, create the Google.Play.Games asmdef in the plugin's root folder, as well as the Google.Play.Games.Editor editor-only asmdef on the plugin's "Editor" folder.
  • You must define the HAVE_GOOGLE_PLAY_GAMEScustom scripting symbol. This package needs this to avoid compilation errors when Google Play Games plugin is not installed.
  • The user must be signed in to Play Games for the cloud save to work

About

Cloud Save interface with implementations for Apple Game Center and Google Play Games

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Cloud Save

Cloud Save interface with implementations for the Unity Editor, Apple's Game Center and Google Play Games Services.

Future implementations might include Unity Gaming Services, Epic Online Services, Steam Cloud and Firebase Cloud Storage.

Note from gilzoide: since I work as a mobile game developer, iOS and Android support is enough for my needs. I will likely not work on the suggested future implementations in the mid term, unless this work is sponsored.

Features

  • Simple interface with async methods for fetching, loading, saving and deleting cloud save games
  • Single interface for all implementations, for easy multiplatform development
  • Supports the Unity Editor by saving files in the "Library/Gilzoide.CloudSave" folder
  • Supports macOS / iOS / tvOS / visionOS platforms using Game Center + iCloud
  • Supports Android platforms using Google Play Games Services

TODO

  • Store additional metadata in Game Center provider
  • Add support for choosing how to resolve conflicts between cloud saved games (current behavior is most recent is kept).
  • Add a way to automate Game Center / iCloud capabilities in XCode project

How to install

Either:

  • Use the openupm registry and install this package using the openupm-cli:
    openupm add com.gilzoide.cloud-save
    
  • Install using the Unity Package Manager with the following URL:
    https://github.com/gilzoide/unity-cloud-save.git#1.0.0-preview4
    
  • Clone this repository or download a snapshot of it directly inside your project's Assets or Packages folder.

Usage example

usingSystem.Collections.Generic;usingGilzoide.CloudSave;usingGilzoide.CloudSave.Providers;usingUnityEngine;publicclassMyCloudSaveBehaviour:MonoBehaviour{voidStart(){// 1. Instantiate the wanted cloud save provider implementation.ICloudSaveProvidercloudSaveProvider;
#if UNITY_EDITOR// 1.a The Editor provider stores files in the "Library/Gilzoide.CloudSave" folder.// This is not the folder one would usually store game save data, so it functions// as a "cloud save" folder even after you clear regular save files or PlayerPrefs.cloudSaveProvider=newEditorCloudSaveProvider();
#elif UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 1.b Android + Google Play Games Services provider.// Requires installing the Google Play Games plugin and setting it up first.// You need to define the `HAVE_GOOGLE_PLAY_GAMES` scripting symbol on Android.// Users must be logged in to Play Games for cloud save to work.cloudSaveProvider=newPlayGamesCloudSaveProvider();
#elif UNITY_STANDALONE_OSX||UNITY_IOS||UNITY_TVOS||UNITY_VISIONOS// 1.c Apple Game Center provider (macOS, iOS, tvOS, visionOS).// Requires defining the Game Center capability in XCode project.// Requires defining the iCloud capability with the "iCloud Documents"// checkbox enabled and an iCloud container configured in XCode.// Users must be logged in to Game Center and iCloud for cloud save to work.cloudSaveProvider=newGameCenterCloudSaveProvider();
#else
// 1.d The Dummy provider does nothing and exists for use in unsupported platforms.// Calling methods on it do not throw, but they also do not save anything.cloudSaveProvider=newDummyCloudSaveProvider();
#endif
#if UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 2. Activate Play Games as the current Social provider in Unity.// Alternativelly, use Play Games API directly instead of UnityEngine.SocialGooglePlayGames.PlayGamesPlatform.Activate();
#endif
// 3. Make sure user is logged in to Play Games / Game Center before using cloud save.// This is not required by the Editor implementation.if(Social.localUser.authenticated){DoSomethingWithCloudSave(cloudSaveProvider);}else{Social.localUser.Authenticate((success,message)=>{if(success){DoSomethingWithCloudSave(cloudSaveProvider);}else{Debug.LogError($"Social authenticate error: {message}");}});}}asyncvoidDoSomethingWithCloudSave(ICloudSaveProvidercloudSaveProvider){// 4. Check if cloud save is enabled before using cloud save functionality.// Some providers require logging in to a social account before using cloud save.// Providers will likely throw exceptions on operations when cloud save is not enabled.if(!cloudSaveProvider.IsCloudSaveEnabled){return;}// 5. Now do something with the cloud save providerList<ICloudSaveGameMetadata>savedGames=awaitcloudSaveProvider.FetchAllAsync();foreach(ICloudSaveGameMetadatasavedGameinsavedGames){Debug.Log($"Found saved game with name {savedGame.Name}");byte[]data=awaitcloudSaveProvider.LoadBytesAsync(savedGame);}awaitcloudSaveProvider.SaveTextAsync("SaveText","Sample text data");awaitcloudSaveProvider.SaveBytesAsync("SaveBytes",newbyte[]{1,2,3,4});awaitcloudSaveProvider.SaveJsonAsync("SaveJson",newVector3(1,2,3));stringsavedText=awaitcloudSaveProvider.LoadTextAsync("SaveText");byte[]savedBytes=awaitcloudSaveProvider.LoadBytesAsync("SaveBytes");Vector3savedJson=awaitcloudSaveProvider.LoadJsonAsync<Vector3>("SaveJson");awaitcloudSaveProvider.DeleteAsync("SaveText");}}

Game Center

  • Game Center is supported on macOS, iOS, tvOS and visionOS platforms.
  • You must add the Game Center capability to the XCode project.
  • You must add the iCloud capability to the XCode project. The "iCloud Documents" checkbox must be enabled and an iCloud container must be configured for the cloud save to work.
  • The user must be signed in to Game Center and have iCloud Drive enabled in their account for cloud save to work.
  • There is a known GameKit issue where saved games are not returned on the first run after a fresh install of the game. A workaround is to delay and retry FetchAllAsync several times before accepting that there really are no saved games. Do this before calling any of the load methods.

Google Play Games Services

  • Play Games is supported on Android platforms
  • You must install the Google Play Games plugin for Unity in your project. If you use an old version of the plugin that does not come with Assembly Definition files, create the Google.Play.Games asmdef in the plugin's root folder, as well as the Google.Play.Games.Editor editor-only asmdef on the plugin's "Editor" folder.
  • You must define the HAVE_GOOGLE_PLAY_GAMEScustom scripting symbol. This package needs this to avoid compilation errors when Google Play Games plugin is not installed.
  • The user must be signed in to Play Games for the cloud save to work

About

Cloud Save interface with implementations for Apple Game Center and Google Play Games

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Cloud Save

Cloud Save interface with implementations for the Unity Editor, Apple's Game Center and Google Play Games Services.

Future implementations might include Unity Gaming Services, Epic Online Services, Steam Cloud and Firebase Cloud Storage.

Note from gilzoide: since I work as a mobile game developer, iOS and Android support is enough for my needs. I will likely not work on the suggested future implementations in the mid term, unless this work is sponsored.

Features

  • Simple interface with async methods for fetching, loading, saving and deleting cloud save games
  • Single interface for all implementations, for easy multiplatform development
  • Supports the Unity Editor by saving files in the "Library/Gilzoide.CloudSave" folder
  • Supports macOS / iOS / tvOS / visionOS platforms using Game Center + iCloud
  • Supports Android platforms using Google Play Games Services

TODO

  • Store additional metadata in Game Center provider
  • Add support for choosing how to resolve conflicts between cloud saved games (current behavior is most recent is kept).
  • Add a way to automate Game Center / iCloud capabilities in XCode project

How to install

Either:

  • Use the openupm registry and install this package using the openupm-cli:
    openupm add com.gilzoide.cloud-save
    
  • Install using the Unity Package Manager with the following URL:
    https://github.com/gilzoide/unity-cloud-save.git#1.0.0-preview4
    
  • Clone this repository or download a snapshot of it directly inside your project's Assets or Packages folder.

Usage example

usingSystem.Collections.Generic;usingGilzoide.CloudSave;usingGilzoide.CloudSave.Providers;usingUnityEngine;publicclassMyCloudSaveBehaviour:MonoBehaviour{voidStart(){// 1. Instantiate the wanted cloud save provider implementation.ICloudSaveProvidercloudSaveProvider;
#if UNITY_EDITOR// 1.a The Editor provider stores files in the "Library/Gilzoide.CloudSave" folder.// This is not the folder one would usually store game save data, so it functions// as a "cloud save" folder even after you clear regular save files or PlayerPrefs.cloudSaveProvider=newEditorCloudSaveProvider();
#elif UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 1.b Android + Google Play Games Services provider.// Requires installing the Google Play Games plugin and setting it up first.// You need to define the `HAVE_GOOGLE_PLAY_GAMES` scripting symbol on Android.// Users must be logged in to Play Games for cloud save to work.cloudSaveProvider=newPlayGamesCloudSaveProvider();
#elif UNITY_STANDALONE_OSX||UNITY_IOS||UNITY_TVOS||UNITY_VISIONOS// 1.c Apple Game Center provider (macOS, iOS, tvOS, visionOS).// Requires defining the Game Center capability in XCode project.// Requires defining the iCloud capability with the "iCloud Documents"// checkbox enabled and an iCloud container configured in XCode.// Users must be logged in to Game Center and iCloud for cloud save to work.cloudSaveProvider=newGameCenterCloudSaveProvider();
#else
// 1.d The Dummy provider does nothing and exists for use in unsupported platforms.// Calling methods on it do not throw, but they also do not save anything.cloudSaveProvider=newDummyCloudSaveProvider();
#endif
#if UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 2. Activate Play Games as the current Social provider in Unity.// Alternativelly, use Play Games API directly instead of UnityEngine.SocialGooglePlayGames.PlayGamesPlatform.Activate();
#endif
// 3. Make sure user is logged in to Play Games / Game Center before using cloud save.// This is not required by the Editor implementation.if(Social.localUser.authenticated){DoSomethingWithCloudSave(cloudSaveProvider);}else{Social.localUser.Authenticate((success,message)=>{if(success){DoSomethingWithCloudSave(cloudSaveProvider);}else{Debug.LogError($"Social authenticate error: {message}");}});}}asyncvoidDoSomethingWithCloudSave(ICloudSaveProvidercloudSaveProvider){// 4. Check if cloud save is enabled before using cloud save functionality.// Some providers require logging in to a social account before using cloud save.// Providers will likely throw exceptions on operations when cloud save is not enabled.if(!cloudSaveProvider.IsCloudSaveEnabled){return;}// 5. Now do something with the cloud save providerList<ICloudSaveGameMetadata>savedGames=awaitcloudSaveProvider.FetchAllAsync();foreach(ICloudSaveGameMetadatasavedGameinsavedGames){Debug.Log($"Found saved game with name {savedGame.Name}");byte[]data=awaitcloudSaveProvider.LoadBytesAsync(savedGame);}awaitcloudSaveProvider.SaveTextAsync("SaveText","Sample text data");awaitcloudSaveProvider.SaveBytesAsync("SaveBytes",newbyte[]{1,2,3,4});awaitcloudSaveProvider.SaveJsonAsync("SaveJson",newVector3(1,2,3));stringsavedText=awaitcloudSaveProvider.LoadTextAsync("SaveText");byte[]savedBytes=awaitcloudSaveProvider.LoadBytesAsync("SaveBytes");Vector3savedJson=awaitcloudSaveProvider.LoadJsonAsync<Vector3>("SaveJson");awaitcloudSaveProvider.DeleteAsync("SaveText");}}

Game Center

  • Game Center is supported on macOS, iOS, tvOS and visionOS platforms.
  • You must add the Game Center capability to the XCode project.
  • You must add the iCloud capability to the XCode project. The "iCloud Documents" checkbox must be enabled and an iCloud container must be configured for the cloud save to work.
  • The user must be signed in to Game Center and have iCloud Drive enabled in their account for cloud save to work.
  • There is a known GameKit issue where saved games are not returned on the first run after a fresh install of the game. A workaround is to delay and retry FetchAllAsync several times before accepting that there really are no saved games. Do this before calling any of the load methods.

Google Play Games Services

  • Play Games is supported on Android platforms
  • You must install the Google Play Games plugin for Unity in your project. If you use an old version of the plugin that does not come with Assembly Definition files, create the Google.Play.Games asmdef in the plugin's root folder, as well as the Google.Play.Games.Editor editor-only asmdef on the plugin's "Editor" folder.
  • You must define the HAVE_GOOGLE_PLAY_GAMEScustom scripting symbol. This package needs this to avoid compilation errors when Google Play Games plugin is not installed.
  • The user must be signed in to Play Games for the cloud save to work

About

Cloud Save interface with implementations for Apple Game Center and Google Play Games

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Cloud Save

Cloud Save interface with implementations for the Unity Editor, Apple's Game Center and Google Play Games Services.

Future implementations might include Unity Gaming Services, Epic Online Services, Steam Cloud and Firebase Cloud Storage.

Note from gilzoide: since I work as a mobile game developer, iOS and Android support is enough for my needs. I will likely not work on the suggested future implementations in the mid term, unless this work is sponsored.

Features

  • Simple interface with async methods for fetching, loading, saving and deleting cloud save games
  • Single interface for all implementations, for easy multiplatform development
  • Supports the Unity Editor by saving files in the "Library/Gilzoide.CloudSave" folder
  • Supports macOS / iOS / tvOS / visionOS platforms using Game Center + iCloud
  • Supports Android platforms using Google Play Games Services

TODO

  • Store additional metadata in Game Center provider
  • Add support for choosing how to resolve conflicts between cloud saved games (current behavior is most recent is kept).
  • Add a way to automate Game Center / iCloud capabilities in XCode project

How to install

Either:

  • Use the openupm registry and install this package using the openupm-cli:
    openupm add com.gilzoide.cloud-save
    
  • Install using the Unity Package Manager with the following URL:
    https://github.com/gilzoide/unity-cloud-save.git#1.0.0-preview4
    
  • Clone this repository or download a snapshot of it directly inside your project's Assets or Packages folder.

Usage example

usingSystem.Collections.Generic;usingGilzoide.CloudSave;usingGilzoide.CloudSave.Providers;usingUnityEngine;publicclassMyCloudSaveBehaviour:MonoBehaviour{voidStart(){// 1. Instantiate the wanted cloud save provider implementation.ICloudSaveProvidercloudSaveProvider;
#if UNITY_EDITOR// 1.a The Editor provider stores files in the "Library/Gilzoide.CloudSave" folder.// This is not the folder one would usually store game save data, so it functions// as a "cloud save" folder even after you clear regular save files or PlayerPrefs.cloudSaveProvider=newEditorCloudSaveProvider();
#elif UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 1.b Android + Google Play Games Services provider.// Requires installing the Google Play Games plugin and setting it up first.// You need to define the `HAVE_GOOGLE_PLAY_GAMES` scripting symbol on Android.// Users must be logged in to Play Games for cloud save to work.cloudSaveProvider=newPlayGamesCloudSaveProvider();
#elif UNITY_STANDALONE_OSX||UNITY_IOS||UNITY_TVOS||UNITY_VISIONOS// 1.c Apple Game Center provider (macOS, iOS, tvOS, visionOS).// Requires defining the Game Center capability in XCode project.// Requires defining the iCloud capability with the "iCloud Documents"// checkbox enabled and an iCloud container configured in XCode.// Users must be logged in to Game Center and iCloud for cloud save to work.cloudSaveProvider=newGameCenterCloudSaveProvider();
#else
// 1.d The Dummy provider does nothing and exists for use in unsupported platforms.// Calling methods on it do not throw, but they also do not save anything.cloudSaveProvider=newDummyCloudSaveProvider();
#endif
#if UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 2. Activate Play Games as the current Social provider in Unity.// Alternativelly, use Play Games API directly instead of UnityEngine.SocialGooglePlayGames.PlayGamesPlatform.Activate();
#endif
// 3. Make sure user is logged in to Play Games / Game Center before using cloud save.// This is not required by the Editor implementation.if(Social.localUser.authenticated){DoSomethingWithCloudSave(cloudSaveProvider);}else{Social.localUser.Authenticate((success,message)=>{if(success){DoSomethingWithCloudSave(cloudSaveProvider);}else{Debug.LogError($"Social authenticate error: {message}");}});}}asyncvoidDoSomethingWithCloudSave(ICloudSaveProvidercloudSaveProvider){// 4. Check if cloud save is enabled before using cloud save functionality.// Some providers require logging in to a social account before using cloud save.// Providers will likely throw exceptions on operations when cloud save is not enabled.if(!cloudSaveProvider.IsCloudSaveEnabled){return;}// 5. Now do something with the cloud save providerList<ICloudSaveGameMetadata>savedGames=awaitcloudSaveProvider.FetchAllAsync();foreach(ICloudSaveGameMetadatasavedGameinsavedGames){Debug.Log($"Found saved game with name {savedGame.Name}");byte[]data=awaitcloudSaveProvider.LoadBytesAsync(savedGame);}awaitcloudSaveProvider.SaveTextAsync("SaveText","Sample text data");awaitcloudSaveProvider.SaveBytesAsync("SaveBytes",newbyte[]{1,2,3,4});awaitcloudSaveProvider.SaveJsonAsync("SaveJson",newVector3(1,2,3));stringsavedText=awaitcloudSaveProvider.LoadTextAsync("SaveText");byte[]savedBytes=awaitcloudSaveProvider.LoadBytesAsync("SaveBytes");Vector3savedJson=awaitcloudSaveProvider.LoadJsonAsync<Vector3>("SaveJson");awaitcloudSaveProvider.DeleteAsync("SaveText");}}

Game Center

  • Game Center is supported on macOS, iOS, tvOS and visionOS platforms.
  • You must add the Game Center capability to the XCode project.
  • You must add the iCloud capability to the XCode project. The "iCloud Documents" checkbox must be enabled and an iCloud container must be configured for the cloud save to work.
  • The user must be signed in to Game Center and have iCloud Drive enabled in their account for cloud save to work.
  • There is a known GameKit issue where saved games are not returned on the first run after a fresh install of the game. A workaround is to delay and retry FetchAllAsync several times before accepting that there really are no saved games. Do this before calling any of the load methods.

Google Play Games Services

  • Play Games is supported on Android platforms
  • You must install the Google Play Games plugin for Unity in your project. If you use an old version of the plugin that does not come with Assembly Definition files, create the Google.Play.Games asmdef in the plugin's root folder, as well as the Google.Play.Games.Editor editor-only asmdef on the plugin's "Editor" folder.
  • You must define the HAVE_GOOGLE_PLAY_GAMEScustom scripting symbol. This package needs this to avoid compilation errors when Google Play Games plugin is not installed.
  • The user must be signed in to Play Games for the cloud save to work

About

Cloud Save interface with implementations for Apple Game Center and Google Play Games

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Cloud Save

Cloud Save interface with implementations for the Unity Editor, Apple's Game Center and Google Play Games Services.

Future implementations might include Unity Gaming Services, Epic Online Services, Steam Cloud and Firebase Cloud Storage.

Note from gilzoide: since I work as a mobile game developer, iOS and Android support is enough for my needs. I will likely not work on the suggested future implementations in the mid term, unless this work is sponsored.

Features

  • Simple interface with async methods for fetching, loading, saving and deleting cloud save games
  • Single interface for all implementations, for easy multiplatform development
  • Supports the Unity Editor by saving files in the "Library/Gilzoide.CloudSave" folder
  • Supports macOS / iOS / tvOS / visionOS platforms using Game Center + iCloud
  • Supports Android platforms using Google Play Games Services

TODO

  • Store additional metadata in Game Center provider
  • Add support for choosing how to resolve conflicts between cloud saved games (current behavior is most recent is kept).
  • Add a way to automate Game Center / iCloud capabilities in XCode project

How to install

Either:

  • Use the openupm registry and install this package using the openupm-cli:
    openupm add com.gilzoide.cloud-save
    
  • Install using the Unity Package Manager with the following URL:
    https://github.com/gilzoide/unity-cloud-save.git#1.0.0-preview4
    
  • Clone this repository or download a snapshot of it directly inside your project's Assets or Packages folder.

Usage example

usingSystem.Collections.Generic;usingGilzoide.CloudSave;usingGilzoide.CloudSave.Providers;usingUnityEngine;publicclassMyCloudSaveBehaviour:MonoBehaviour{voidStart(){// 1. Instantiate the wanted cloud save provider implementation.ICloudSaveProvidercloudSaveProvider;
#if UNITY_EDITOR// 1.a The Editor provider stores files in the "Library/Gilzoide.CloudSave" folder.// This is not the folder one would usually store game save data, so it functions// as a "cloud save" folder even after you clear regular save files or PlayerPrefs.cloudSaveProvider=newEditorCloudSaveProvider();
#elif UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 1.b Android + Google Play Games Services provider.// Requires installing the Google Play Games plugin and setting it up first.// You need to define the `HAVE_GOOGLE_PLAY_GAMES` scripting symbol on Android.// Users must be logged in to Play Games for cloud save to work.cloudSaveProvider=newPlayGamesCloudSaveProvider();
#elif UNITY_STANDALONE_OSX||UNITY_IOS||UNITY_TVOS||UNITY_VISIONOS// 1.c Apple Game Center provider (macOS, iOS, tvOS, visionOS).// Requires defining the Game Center capability in XCode project.// Requires defining the iCloud capability with the "iCloud Documents"// checkbox enabled and an iCloud container configured in XCode.// Users must be logged in to Game Center and iCloud for cloud save to work.cloudSaveProvider=newGameCenterCloudSaveProvider();
#else
// 1.d The Dummy provider does nothing and exists for use in unsupported platforms.// Calling methods on it do not throw, but they also do not save anything.cloudSaveProvider=newDummyCloudSaveProvider();
#endif
#if UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 2. Activate Play Games as the current Social provider in Unity.// Alternativelly, use Play Games API directly instead of UnityEngine.SocialGooglePlayGames.PlayGamesPlatform.Activate();
#endif
// 3. Make sure user is logged in to Play Games / Game Center before using cloud save.// This is not required by the Editor implementation.if(Social.localUser.authenticated){DoSomethingWithCloudSave(cloudSaveProvider);}else{Social.localUser.Authenticate((success,message)=>{if(success){DoSomethingWithCloudSave(cloudSaveProvider);}else{Debug.LogError($"Social authenticate error: {message}");}});}}asyncvoidDoSomethingWithCloudSave(ICloudSaveProvidercloudSaveProvider){// 4. Check if cloud save is enabled before using cloud save functionality.// Some providers require logging in to a social account before using cloud save.// Providers will likely throw exceptions on operations when cloud save is not enabled.if(!cloudSaveProvider.IsCloudSaveEnabled){return;}// 5. Now do something with the cloud save providerList<ICloudSaveGameMetadata>savedGames=awaitcloudSaveProvider.FetchAllAsync();foreach(ICloudSaveGameMetadatasavedGameinsavedGames){Debug.Log($"Found saved game with name {savedGame.Name}");byte[]data=awaitcloudSaveProvider.LoadBytesAsync(savedGame);}awaitcloudSaveProvider.SaveTextAsync("SaveText","Sample text data");awaitcloudSaveProvider.SaveBytesAsync("SaveBytes",newbyte[]{1,2,3,4});awaitcloudSaveProvider.SaveJsonAsync("SaveJson",newVector3(1,2,3));stringsavedText=awaitcloudSaveProvider.LoadTextAsync("SaveText");byte[]savedBytes=awaitcloudSaveProvider.LoadBytesAsync("SaveBytes");Vector3savedJson=awaitcloudSaveProvider.LoadJsonAsync<Vector3>("SaveJson");awaitcloudSaveProvider.DeleteAsync("SaveText");}}

Game Center

  • Game Center is supported on macOS, iOS, tvOS and visionOS platforms.
  • You must add the Game Center capability to the XCode project.
  • You must add the iCloud capability to the XCode project. The "iCloud Documents" checkbox must be enabled and an iCloud container must be configured for the cloud save to work.
  • The user must be signed in to Game Center and have iCloud Drive enabled in their account for cloud save to work.
  • There is a known GameKit issue where saved games are not returned on the first run after a fresh install of the game. A workaround is to delay and retry FetchAllAsync several times before accepting that there really are no saved games. Do this before calling any of the load methods.

Google Play Games Services

  • Play Games is supported on Android platforms
  • You must install the Google Play Games plugin for Unity in your project. If you use an old version of the plugin that does not come with Assembly Definition files, create the Google.Play.Games asmdef in the plugin's root folder, as well as the Google.Play.Games.Editor editor-only asmdef on the plugin's "Editor" folder.
  • You must define the HAVE_GOOGLE_PLAY_GAMEScustom scripting symbol. This package needs this to avoid compilation errors when Google Play Games plugin is not installed.
  • The user must be signed in to Play Games for the cloud save to work

About

Cloud Save interface with implementations for Apple Game Center and Google Play Games

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Cloud Save

Cloud Save interface with implementations for the Unity Editor, Apple's Game Center and Google Play Games Services.

Future implementations might include Unity Gaming Services, Epic Online Services, Steam Cloud and Firebase Cloud Storage.

Note from gilzoide: since I work as a mobile game developer, iOS and Android support is enough for my needs. I will likely not work on the suggested future implementations in the mid term, unless this work is sponsored.

Features

  • Simple interface with async methods for fetching, loading, saving and deleting cloud save games
  • Single interface for all implementations, for easy multiplatform development
  • Supports the Unity Editor by saving files in the "Library/Gilzoide.CloudSave" folder
  • Supports macOS / iOS / tvOS / visionOS platforms using Game Center + iCloud
  • Supports Android platforms using Google Play Games Services

TODO

  • Store additional metadata in Game Center provider
  • Add support for choosing how to resolve conflicts between cloud saved games (current behavior is most recent is kept).
  • Add a way to automate Game Center / iCloud capabilities in XCode project

How to install

Either:

  • Use the openupm registry and install this package using the openupm-cli:
    openupm add com.gilzoide.cloud-save
    
  • Install using the Unity Package Manager with the following URL:
    https://github.com/gilzoide/unity-cloud-save.git#1.0.0-preview4
    
  • Clone this repository or download a snapshot of it directly inside your project's Assets or Packages folder.

Usage example

usingSystem.Collections.Generic;usingGilzoide.CloudSave;usingGilzoide.CloudSave.Providers;usingUnityEngine;publicclassMyCloudSaveBehaviour:MonoBehaviour{voidStart(){// 1. Instantiate the wanted cloud save provider implementation.ICloudSaveProvidercloudSaveProvider;
#if UNITY_EDITOR// 1.a The Editor provider stores files in the "Library/Gilzoide.CloudSave" folder.// This is not the folder one would usually store game save data, so it functions// as a "cloud save" folder even after you clear regular save files or PlayerPrefs.cloudSaveProvider=newEditorCloudSaveProvider();
#elif UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 1.b Android + Google Play Games Services provider.// Requires installing the Google Play Games plugin and setting it up first.// You need to define the `HAVE_GOOGLE_PLAY_GAMES` scripting symbol on Android.// Users must be logged in to Play Games for cloud save to work.cloudSaveProvider=newPlayGamesCloudSaveProvider();
#elif UNITY_STANDALONE_OSX||UNITY_IOS||UNITY_TVOS||UNITY_VISIONOS// 1.c Apple Game Center provider (macOS, iOS, tvOS, visionOS).// Requires defining the Game Center capability in XCode project.// Requires defining the iCloud capability with the "iCloud Documents"// checkbox enabled and an iCloud container configured in XCode.// Users must be logged in to Game Center and iCloud for cloud save to work.cloudSaveProvider=newGameCenterCloudSaveProvider();
#else
// 1.d The Dummy provider does nothing and exists for use in unsupported platforms.// Calling methods on it do not throw, but they also do not save anything.cloudSaveProvider=newDummyCloudSaveProvider();
#endif
#if UNITY_ANDROID&&HAVE_GOOGLE_PLAY_GAMES// 2. Activate Play Games as the current Social provider in Unity.// Alternativelly, use Play Games API directly instead of UnityEngine.SocialGooglePlayGames.PlayGamesPlatform.Activate();
#endif
// 3. Make sure user is logged in to Play Games / Game Center before using cloud save.// This is not required by the Editor implementation.if(Social.localUser.authenticated){DoSomethingWithCloudSave(cloudSaveProvider);}else{Social.localUser.Authenticate((success,message)=>{if(success){DoSomethingWithCloudSave(cloudSaveProvider);}else{Debug.LogError($"Social authenticate error: {message}");}});}}asyncvoidDoSomethingWithCloudSave(ICloudSaveProvidercloudSaveProvider){// 4. Check if cloud save is enabled before using cloud save functionality.// Some providers require logging in to a social account before using cloud save.// Providers will likely throw exceptions on operations when cloud save is not enabled.if(!cloudSaveProvider.IsCloudSaveEnabled){return;}// 5. Now do something with the cloud save providerList<ICloudSaveGameMetadata>savedGames=awaitcloudSaveProvider.FetchAllAsync();foreach(ICloudSaveGameMetadatasavedGameinsavedGames){Debug.Log($"Found saved game with name {savedGame.Name}");byte[]data=awaitcloudSaveProvider.LoadBytesAsync(savedGame);}awaitcloudSaveProvider.SaveTextAsync("SaveText","Sample text data");awaitcloudSaveProvider.SaveBytesAsync("SaveBytes",newbyte[]{1,2,3,4});awaitcloudSaveProvider.SaveJsonAsync("SaveJson",newVector3(1,2,3));stringsavedText=awaitcloudSaveProvider.LoadTextAsync("SaveText");byte[]savedBytes=awaitcloudSaveProvider.LoadBytesAsync("SaveBytes");Vector3savedJson=awaitcloudSaveProvider.LoadJsonAsync<Vector3>("SaveJson");awaitcloudSaveProvider.DeleteAsync("SaveText");}}

Game Center

  • Game Center is supported on macOS, iOS, tvOS and visionOS platforms.
  • You must add the Game Center capability to the XCode project.
  • You must add the iCloud capability to the XCode project. The "iCloud Documents" checkbox must be enabled and an iCloud container must be configured for the cloud save to work.
  • The user must be signed in to Game Center and have iCloud Drive enabled in their account for cloud save to work.
  • There is a known GameKit issue where saved games are not returned on the first run after a fresh install of the game. A workaround is to delay and retry FetchAllAsync several times before accepting that there really are no saved games. Do this before calling any of the load methods.

Google Play Games Services

  • Play Games is supported on Android platforms
  • You must install the Google Play Games plugin for Unity in your project. If you use an old version of the plugin that does not come with Assembly Definition files, create the Google.Play.Games asmdef in the plugin's root folder, as well as the Google.Play.Games.Editor editor-only asmdef on the plugin's "Editor" folder.
  • You must define the HAVE_GOOGLE_PLAY_GAMEScustom scripting symbol. This package needs this to avoid compilation errors when Google Play Games plugin is not installed.
  • The user must be signed in to Play Games for the cloud save to work

About

Cloud Save interface with implementations for Apple Game Center and Google Play Games

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages