GithubHelp home page GithubHelp logo

homy-game-studio / hgs-unity-local-storage Goto Github PK

View Code? Open in Web Editor NEW
0.0 1.0 0.0 243 KB

Gerencie arquivos e cache de forma segura em sua aplicação.

License: MIT License

C# 100.00%
cache cross-platform filesystem persistency scriptable-object unity

hgs-unity-local-storage's Introduction

semantic-release openupm

Introdução

Local Storage utiliza ScriptableObjects para tornar o acesso à arquivos mais facil e pratico. Este package conta com:

  • Armazenamento de arquivos no disco.
  • Criptografia.
  • Cache de arquivos (exclusão automatica após x segundos, minutos, horas, dias).

Instalação

OpenUPM:

openupm add com.hgs.local-storage

Package Manager:

https://github.com/homy-game-studio/hgs-unity-local-storage.git#upm

Se preferir, substitua upm uma versão especifica, exemplo:

https://github.com/homy-game-studio/hgs-unity-local-storage.git#1.0.0

PersistentStorage

PersistentStorage mantém as funcionalidades basicas de gestão de arquivo e criptografia. Funciona como PlayerPrefs, porém sem restrição de tamanho.

Atributos

Propriedade Descrição
useCrypto Quando verdadeiro, utiliza criptografia na escrita/leitura dos arquivos no disco.
passPhrase Sua senha de criptografgia, utilizado apenas quando useCrypto for verdadeiro.
folder Pasta onde os arquivos serão salvos, uma barra / será adicionada automaticamente no final.

Metódos

Metódo Retorno Descrição
Exists(string key) bool Verifica se uma chave existe no storage.
WriteBytes(string key, byte[] bytes) void Cria/Sobrescreve um arquivo com a key designada, com o conteúdo de bytes
ReadBytes(string key) byte[] Lê os bytes salvos na key designada, retorna null caso o arquivo não exista
Clear() void Delete all files from storage

CacheStorage

CacheStorage herda as propriedades de um PersistentStorage, porém adiciona uma camada extra para excluir arquivos expirados. É recomendado para guardar imagens de perfil, configurações remotas, e quaisquer dados que possua tempo de vida.

Propriedade Descrição
useCrypto Quando verdadeiro, utiliza criptografia na escrita/leitura dos arquivos no disco.
passPhrase Sua senha de criptografgia, utilizado apenas quando useCrypto for verdadeiro.
folder Pasta onde os arquivos serão salvos, uma barra / será adicionada automaticamente no final.
expiration Tempo em minutos para exclusão de automatica de um arquivo individual.
Metódo Retorno Descrição
Exists(string key) bool Verifica se uma chave existe no storage
WriteBytes(string key, byte[] bytes) void Cria/Sobrescreve um arquivo com a key designada, com o conteúdo de bytes
ReadBytes(string key) byte[] Lê os bytes salvos na key designada, retorna null caso o arquivo não exista ou esteja expirado
Clear() void Delete all files from storage

Extensões

Não manipule bytes diretamente, utilize as extensões disponibilizadas no package:

StringExtension

Disponivel em:

using HGS.LocalStorage.StringExtension;
Metódo Retorno Descrição
WriteString(string key, string content) void Cria/Sobrescreve um arquivo com a key designada, com o conteúdo de string
ReadString(string key) string Lê uma string salva na key designada, retorna null caso o arquivo não exista ou esteja expirado

Texture2DExtension

Disponivel em:

using using HGS.LocalStorage.Texture2DExtension;
Metódo Retorno Descrição
WriteTexture2D(string key, Texture2D texture) void Cria/Sobrescreve um arquivo com a key designada, com o conteúdo de texture
ReadTexture2D(string key) Texture2D Lê um Texture2D salvo nakeydesignada, retornanull caso o arquivo não exista ou esteja expirado

JsonExtension

Disponivel em:

using using HGS.LocalStorage.JsonExtension;
Metódo Retorno Descrição
WriteObject<T>(string key, T obj) void Cria/Sobrescreve um arquivo com a key designada, com o conteúdo de T
ReadObject<T>(string key) T Lê um T salvo na key designada, retorna null caso o arquivo não exista ou esteja expirado

Criando um storage

  1. Na aba project clique com o botão direito do mouse e crie um novo PersistentStorage ou CacheStorage.

  1. Seu Storage será um ScriptableObject.

É recomendado criar um Storage para cada pasta. Assim você evita colisão de chaves em partes destintas do seu projeto.

Exemplos

Exemplo completo

Você pode baixar o código de exemplo dentro do seu projeto unity através do Package Manager:

Escrita e leitura de string

using HGS.LocalStorage;
using HGS.LocalStorage.StringExtension;
using UnityEngine;
using UnityEngine.UI;

public class StringSample : MonoBehaviour
{
  [SerializeField] Storage storage;
  [SerializeField] string key;
  [SerializeField] InputField inputField;
  [SerializeField] Button writeBtn;
  [SerializeField] Button readBtn;

  void Awake()
  {
    writeBtn.onClick.AddListener(HandleOnClickBtnWrite);
    readBtn.onClick.AddListener(HandleOnClickBtnRead);
  }

  private void HandleOnClickBtnRead()
  {
    // Lê a string salva na chave designada.
    inputField.text = storage.ReadString(key);
  }

  private void HandleOnClickBtnWrite()
  {
    // Escreve o conteúdo  do text  field na chave designada, dentro do storage...
    // ...criando um novo arquivo para esta chave
    storage.WriteString(key, inputField.text);
  }
}

Escrita e leitura de Texture2D

using System.Collections;
using HGS.LocalStorage;
using HGS.LocalStorage.Texture2DExtension;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class Texture2DSample : MonoBehaviour
{
  [SerializeField] Storage storage;
    // Utilizamos url como chave da textura no storage.
  [SerializeField] string url;
  [SerializeField] RawImage image;

  void Start()
  {
    Load(url);
  }

  private void Load(string imgUrl)
  {
    // Checa se o arquivo existe no storage, caso exista, faz a leitura, caso contrario, baixa a imagem.
    if (storage.Exists(imgUrl))
      LoadFromCache(imgUrl);
    else
      LoadFromWeb(imgUrl);
  }

  private void LoadFromCache(string imgUrl)
  {
    // obtém a textura no storage
    var texture = storage.ReadTexture2D(imgUrl);
    image.texture = texture;
  }

  private void LoadFromWeb(string imgUrl)
  {
    StartCoroutine(Download(imgUrl));
  }

  IEnumerator Download(string url)
  {
    var request = UnityWebRequestTexture.GetTexture(url);

    Debug.Log($"downloading: {url}");

    yield return request.SendWebRequest();

    if (request.result != UnityWebRequest.Result.Success)
    {
      Debug.LogError($"Download of {url} failed!");
    }
    else
    {
      var texture = DownloadHandlerTexture.GetContent(request);

      image.texture = texture;

      // Salva a textura no storage
      storage.WriteTexture2D(url, texture);
    }
  }
}

Como contribuir

Se você encontrou algum bug, tem alguma sugestão ou dúvida, crie uma issue aqui no github. Caso queira contribuir com código, faça um fork do projeto e siga as boas praticas abaixo, e faça um pull request.

Convenção de namespace

Para isolar os assets de outros scripts isolamos todos no namespace do package HGS.<package-name>. Neste package usamos HGS.LocalStorage.

Branchs

Este package conta com duas branchs principais:

  • master -> Aqui guardamos todo material do projeto.
  • upm -> Aqui mantemos uma copia do package que se encontra na pasta Assets/Package.

Sempre que um merge é feito na branch unity, o script de CI irá criar uma copia da subpasta Assets/Package automaticamente na branch upm.

Convenção de commit

Utilizamos o plugin semantic-release para facilitar o sistema de release e versionamento, portanto, precisamos seguir com a seguinte convenção de commit:

<type>(<scope>): <short summary>
  │       │             │
  │       │             └─⫸ Breve descrição do que foi feito
  │       │
  │       └─⫸ Scope: Namespace, nome do script, etc..
  │
  └─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|test

Type.:

  • build: Alterações que afetam o sistema de compilação ou dependências externas (escopos de exemplo: sistema de pacotes)
  • ci: Alterações em arquivos e scripts de configuração de CI (escopos de exemplo: Circle, - BrowserStack, SauceLabs)
  • docs: Apenas mudanças na documentação
  • feat: Um novo recurso
  • fix: Uma correção de bug
  • perf: Uma mudança de código que melhora o desempenho
  • refactor: Uma alteração de código que não corrige um bug nem adiciona um recurso
  • test: Adicionando testes ausentes ou corrigindo testes existentes

hgs-unity-local-storage's People

Contributors

matheusmoura17 avatar semantic-release-bot avatar

Watchers

 avatar

hgs-unity-local-storage's Issues

Error on Invalidate empty CacheStorage

Behaviour

cacheStorage.Invlidate(); throws DirectoryNotFoundException when the directory not exists yet.

Expected Behaviour

If the directory is not found, cacheStorage.Invlidate(); shold be ignored.

Error Stack

DirectoryNotFoundException: Could not find a part of the path "C:/Users/Matheus Moura/AppData/LocalLow/Homy Game Studio/Tower Stacker/pictures/b7286587de4425770717ffdac19fa1faa360fdeb5b5cb07676ecf492e2d121d4".
System.IO.File.Delete (System.String path) (at <695d1cc93cca45069c528c15c9fdd749>:0)
HGS.LocalStorage.Utils.FileUtility.Delete (System.String path) (at Library/PackageCache/com.hgs.local-storage@1a34572c28/Runtime/Scripts/Utils/FileUtility.cs:34)
HGS.LocalStorage.CacheStorage.InvalidateFile (System.String path) (at Library/PackageCache/com.hgs.local-storage@1a34572c28/Runtime/Scripts/CacheStorage.cs:29)
HGS.LocalStorage.CacheStorage.Invalidate (System.String key) (at Library/PackageCache/com.hgs.local-storage@1a34572c28/Runtime/Scripts/CacheStorage.cs:16)
HGS.LocalStorage.CacheStorage.Exists (System.String key) (at Library/PackageCache/com.hgs.local-storage@1a34572c28/Runtime/Scripts/CacheStorage.cs:41)
HGS.TinyPuzzleToolkit.StateDrawers.SpriteDownloadStateDrawer.Draw () (at C:/Users/Matheus Moura/workspace/hgs/hgs-unity-tiny-puzzle-toolkit/Assets/Package/Runtime/Scripts/StateDrawers/SpriteDownloadStateDrawer.cs:44)
HGS.TinyPuzzleToolkit.StateDrawers.SpriteDownloadStateDrawer.OnEnable () (at C:/Users/Matheus Moura/workspace/hgs/hgs-unity-tiny-puzzle-toolkit/Assets/Package/Runtime/Scripts/StateDrawers/SpriteDownloadStateDrawer.cs:24)
``

Add JsonExtension

Expected:

struct UserData
{
    public string displayName;
    public  int  score;
}
var input = new Userdata
{
    displayName: "Joaquim",
    score: 10
}
storage.WriteObject("user", input);
var user = storage.ReadObject<UserData>("user")

Add DeleteKey() Method

Cause

Isn't possible remove single key. Like: storage.Delete("my-key")

Expected

Remove single key with

Storage storage;
storage.Delete("key-name" );

DirectoryNotFound Exception when Invalidate()

Behaviour

When CacheStorage start, Invalidate() throws DirectoryNotFoundException because directory not created yet.

ExpectedBehaviour

Check if directory exists after file invalidation.

Error Stack

DirectoryNotFoundException: Could not find a part of the path 'C:\Users\Matheus Moura\AppData\LocalLow\Homy Game Studio\Kong Climber\pictures'.
System.IO.__Error.WinIOError (System.Int32 errorCode, System.String maybeFullPath) (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.IO.FileSystemEnumerableIterator`1[TSource].HandleError (System.Int32 hr, System.String path) (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.IO.FileSystemEnumerableIterator`1[TSource].CommonInit () (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.IO.FileSystemEnumerableIterator`1[TSource]..ctor (System.String path, System.String originalUserPath, System.String searchPattern, System.IO.SearchOption searchOption, System.IO.SearchResultHandler`1[TSource] resultHandler, System.Boolean checkHost) (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.IO.FileSystemEnumerableFactory.CreateFileNameIterator (System.String path, System.String originalUserPath, System.String searchPattern, System.Boolean includeFiles, System.Boolean includeDirs, System.IO.SearchOption searchOption, System.Boolean checkHost) (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.IO.Directory.InternalGetFileDirectoryNames (System.String path, System.String userPathOriginal, System.String searchPattern, System.Boolean includeFiles, System.Boolean includeDirs, System.IO.SearchOption searchOption, System.Boolean checkHost) (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.IO.Directory.InternalGetFiles (System.String path, System.String searchPattern, System.IO.SearchOption searchOption) (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.IO.Directory.GetFiles (System.String path) (at <695d1cc93cca45069c528c15c9fdd749>:0)
HGS.LocalStorage.Utils.FileUtility.GetFiles (System.String folder) (at Library/PackageCache/com.hgs.local-storage@ed17f3ba6f/Runtime/Scripts/Utils/FileUtility.cs:29)
HGS.LocalStorage.CacheStorage.OnEnable () (at Library/PackageCache/com.hgs.local-storage@ed17f3ba6f/Runtime/Scripts/CacheStorage.cs:35)

Same problem of #12

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.