facebook twitter hatena line email

「Unity/Csharp/Cache」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
 
行1: 行1:
 
==サンプル==
 
==サンプル==
 +
一定時間だけcacheするサンプルライブラリ。
 +
 
*取得
 
*取得
 
  Debug.Log("key1=" + Cache.GetCache("key1"));
 
  Debug.Log("key1=" + Cache.GetCache("key1"));

2020年1月15日 (水) 15:53時点における最新版

サンプル

一定時間だけcacheするサンプルライブラリ。

  • 取得
Debug.Log("key1=" + Cache.GetCache("key1"));
  • 設定
Cache.SetCache("key1", "hoge", 60);

60秒だけ保存

ライブラリ

Cache.cs

using UnityEngine;
using System;

/**
 * キャッシュクラス
 * 取得:
 * Debug.Log("key1=" + Cache.GetCache("key1"));
 * 設定:
 * Cache.SetCache("key1", "hoge", 60);
 */
public class Cache {
    static string cacheKey = "cacheKey";
    /// <summary>
    /// 指定されたオブジェクトの情報を保存します
    /// </summary>
    private static void SetObject<T>(string key, T obj)
    {
        string json = JsonUtility.ToJson(obj);
        Debug.Log("key=" + key);
        Debug.Log("SetObject json=" + json);
        PlayerPrefs.SetString(key, json);
    }
    /// <summary>
    /// 指定されたオブジェクトの情報を読み込みます
    /// </summary>
    private static T GetObject<T>(string key)
    {
        string json = PlayerPrefs.GetString(key);
        Debug.Log("key=" + key);
        Debug.Log("GetObject json=" + json);
        return JsonUtility.FromJson<T>(json);
    }
    private static void DelObject<T>(string key)
    {
        PlayerPrefs.SetString(key, null);
    }
    private static void SetObjectCache<T>(string key, T obj)
    {
        SetObject(cacheKey + "-" + key, obj);
    }
    private static T GetObjectCache<T>(string key)
    {
        return GetObject<T>(cacheKey + "-" + key);
    }
    private static void DelObjectCache<T>(string key)
    {
        DelObject<T>(cacheKey + "-" + key);
    }
    // keyと値と保持秒数
    public static void SetCache(string key, string value, int lifetimeSec)
    {
        CacheRow cache = new CacheRow();
        cache.data = value;
        cache.limitUnixtime = Now() + lifetimeSec;
        SetObjectCache(key, cache);
    }
    public static string GetCache(string key) {
        CacheRow cache = GetObjectCache<CacheRow>(key);
        if (cache != null) {
            if (Now() < cache.limitUnixtime)
            {
                return cache.data;
            }
            else
            {
                DelCache(key); // 削除しておく。
            }
        }
        return "";
    }
    public static void DelCache(string key)
    {
        DelObjectCache<string>(key);
    }
    private static readonly DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    public static long Now()
    {
        return (FromDateTime(DateTime.UtcNow));
    }
    public static long FromDateTime(DateTime dateTime)
    {
        double nowTicks = (dateTime.ToUniversalTime() - UNIX_EPOCH).TotalSeconds;
        return (long)nowTicks;
    }

}

CacheRow.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[Serializable]
public class CacheRow
{
    [SerializeField]
    public String data = "";
    [SerializeField]
    public long limitUnixtime = 0;
}