¡¡¤ª»È¤¤¤Î¥Ç¡¼¥¿¤ò¥»¡¼¥Ö¤¹¤ë¥¿¥¤¥ß¥ó¥°¤ò¹Í¤¨¤Æ¡¢Å¬µ¹¤Ê°ÌÃ֤˥»¡¼¥Ö¤ò¹Ô¤¦¤¿¤á¤Î½èÍý¤òµ½Ò¤·¤Þ¤¹¡£
OfflineTimeManager ¥¹¥¯¥ê¥×¥È¤È¤¤¤¦¡¢»þ´Ö¤ò´ÉÍý¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Ë¤ª¤¤¤Æ¥»¡¼¥Ö¤¹¤ë¤Ù¤¥¿¥¤¥ß¥ó¥°¤¬¤É¤Î¥á¥½¥Ã¥É¤Ë¤¢¤ë¤Î¤«¤ò¡¢½èÍý¤ò¸«Ä¾¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
¡¡JobTimeData ¥¯¥é¥¹¤Î¾ðÊó¤ò¥»¡¼¥Ö¤¹¤ë¤¿¤á¤Ë¡¢PlayerPrefsHelper ¥¯¥é¥¹¤ËÍÑ°Õ¤·¤Æ¤¢¤ë SaveSetObjectData ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£
¤³¤Î¥á¥½¥Ã¥É¤Ç¤Ï¥¯¥é¥¹¤Î¾ðÊó¤ò Json ¤ËÊÑ´¹¤·¤Æ PlayerPrefs ¥¯¥é¥¹¤Ç¥»¡¼¥Ö¤ò¹Ô¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¿¤á¤Ç¤¹¡£
¡¡¥»¡¼¥Ö¤¹¤ëºÝ¤Î static ¥¯¥é¥¹¤Ç¤¢¤ë PlayerPrefsHelper ¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤Î¸Æ¤Ó½Ð¤·Ì¿Îá¤Î½ñ¼°¤ò³Ð¤¨¤Æ¤¤¤Ã¤Æ¤¯¤À¤µ¤¤¡£
¡¡¤Ê¤ª¡¢¥»¡¼¥Ö¤ò¹Ô¤¦¾ì¹ç¡¢¡Ö¥»¡¼¥Ö¤Î¥¿¥¤¥ß¥ó¥°¡×¤Î¾¤Ë¡¢¡Ö
¥»¡¼¥Ö¤¹¤ëÂоݤΤª»È¤¤¤Î¥Ç¡¼¥¿¤¬¤¢¤ë¤Î¤«¡×¡¢¡Ö
Ê£¿ô¤¢¤ë¾ì¹ç¤Ë¤Ï¤É¤¦¤ä¤Ã¤Æ¤½¤ì¤é¤ò¥»¡¼¥Ö¤¹¤ë¤Î¤«¡×¡¢
¤½¤¦¤¤¤Ã¤¿Éôʬ¤â½èÍý¤ÎÀ߷פȤ·¤Æ¤Ï¹Í¤¨¤Æ¤¤¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£
¡¡¤É¤Î¤è¤¦¤Ë¤¹¤ì¤Ð¥»¡¼¥Ö¤Ë¤Þ¤Ä¤ï¤ë¥í¥¸¥Ã¥¯¤òÁȤߤ³¤ó¤Ç¤¤¤±¤ë¤Î¤«¡¢¼«Ê¬¤Ç¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
½èÍý¤Î¥¤¥á¡¼¥¸¤¬½ÐÍ褿¤é¤Þ¤º¤Ï¡¢ÆüËܸì¤Î¥³¥á¥ó¥È¤ò³ºÅö¤¹¤ë¥á¥½¥Ã¥ÉÆâ¤Ëµ½Ò¤·¡¢¤½¤ì¤«¤é½èÍý¤òµ½Ò¤·¤Æ¤¤¤Ã¤Æ¤ß¤Þ¤·¤ç¤¦¡£
¡¡
¼«Ê¬¤¬¤¤¤Þ½ñ¤±¤ë½èÍý¤ò¹Í¤¨¤Æ½ñ¤¤¤Æ¤ß¤ë¡£¤½¤¦¤¹¤ë¤³¤È¤Ç¡¢¼«Ê¬¤¬¤¤¤Þ½ñ¤±¤Ê¤¤½èÍý¡¢¥¤¥á¡¼¥¸¤¬¤ï¤«¤Ê¤¤½èÍý¤È¤ÎºÙʬ²½¤¬¿Þ¤ì¤Þ¤¹¡£
¤½¤¦¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¤Ï¤¸¤á¤Æ¡¢¼«Ê¬¤¬Ä´¤Ù¤ë¤Ù¤ÌäÂê¡¢¹Í¤¨¤ë¤Ù¤½èÍý¤Î¸«¶Ë¤á¤¬¹Ô¤¨¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¤³¤ì¤ò²¿²ó¤â·«¤êÊÖ¤·¤Æ¥×¥í¥°¥é¥à¤Ï³Ð¤¨¤Æ¤¤¤¯¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¶µºà¤Î³Îǧ¤Ï¼«Ê¬¤ÇÄ©À路¤¿¤¢¤È¤ÇÌäÂꤢ¤ê¤Þ¤»¤ó¡£
OfflineTimeManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class OfflineTimeManager : MonoBehaviour
{
public static OfflineTimeManager instance;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡// ¥·¥ó¥°¥ë¥È¥óÍѤÎÊÑ¿ô
private DateTime loadDateTime = new DateTime();¡¡¡¡¡¡¡¡¡¡ // Á°²ó¥²¡¼¥à¤ò»ß¤á¤¿»þ¤Ë¥»¡¼¥Ö¤·¤Æ¤¤¤ë»þ´Ö
private int elaspedTime; ¡¡¡¡¡¡ // ·Ð²á»þ´Ö
private const string SAVE_KEY_DATETIME = "OfflineDateTime";¡¡¡¡¡¡// »þ´Ö¤ò¥»¡¼¥Ö¡¦¥í¡¼¥É¤¹¤ëºÝ¤ÎÊÑ¿ô¡£Äê¿ô¤È¤·¤ÆÀë¸À¤¹¤ë
private const string FORMAT = "yyyy/MM/dd HH:mm:ss";¡¡¡¡ ¡¡¡¡¡¡¡¡// Æü»þ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È»ØÄêÍÑ
private const string WORKING_JOB_SAVE_KEY = "workingJobNo_"; // ¤ª»È¤¤¤Î»þ´Ö¤Î¥Ç¡¼¥¿¤ò¥»¡¼¥Ö¡¦¥í¡¼¥É¤¹¤ë¤¿¤á¤ÎÊÑ¿ô
private GameManager gameManager;
/// <summary>
/// ¤ª»È¤¤ÍѤλþ´Ö¥Ç¡¼¥¿¤ò´ÉÍý¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹
/// </summary>
[Serializable]
public class JobTimeData {
public int jobNo; // ¤ª»È¤¤¤ÎÄ̤·ÈÖ¹æ
public int elaspedJobTime; // ¤ª»È¤¤¤Î»Ä¤ê»þ´Ö
public string jobTimeString; // DateTime ¥¯¥é¥¹¤òʸ»úÎó¤Ë¤¹¤ë¤¿¤á¤ÎÊÑ¿ô
/// <summary>
/// DateTime ¤òʸ»úÎ󷿤ÇÊݸ¤·¤Æ¤¤¤ë¤Î¤Ç¡¢DateTime ·¿¤ËÌᤷ¤Æ¼èÆÀ
/// </summary>
/// <returns></returns>
public DateTime GetDateTime() {
return DateTime.ParseExact(jobTimeString, FORMAT, null);
}
}
[Header("¤ª»È¤¤¤Î»þ´Ö¥Ç¡¼¥¿¤Î¥ê¥¹¥È")]
public List<JobTimeData> workingJobTimeDatasList = new List<JobTimeData>();
void Awake() {
if (instance == null) {
instance = this;
DontDestroyOnLoad(gameObject);
} else {
Destroy(gameObject);
}
// »þ´Ö¤Î¥»¡¼¥Ö¥Ç¡¼¥¿¤Î³Îǧ¤È¥í¡¼¥É
LoadOfflineDateTime();
// ¥ª¥Õ¥é¥¤¥ó¤Ç¤Î·Ð²á»þ´Ö¤ò·×»»
CalculateOfflineDateTimeElasped(loadDateTime);
// TODO ¤ª»È¤¤¤Î¥Ç¡¼¥¿¤Î¥í¡¼¥É
}
/// <summary>
/// ¥²¡¼¥à¤¬½ªÎ»¤·¤¿¤È¤¤Ë¼«Æ°Åª¤Ë¸Æ¤Ð¤ì¤ë
/// </summary>
private void OnApplicationQuit() {
// ¸½ºß¤Î»þ´Ö¤Î¥»¡¼¥Ö
SaveOfflineDateTime();
Debug.Log("¥²¡¼¥àÃæÃÇ¡£»þ´Ö¤Î¥»¡¼¥Ö´°Î»");
////*¤³¤³¤«¤é½èÍý¤òÄɲà *////
// ¤ª»È¤¤Ãæ¤Î¥Ç¡¼¥¿¤¬£±¤Ä°Ê¾å¤¢¤ë¾ì¹ç
for (int i = 0; i < workingJobTimeDatasList.Count; i++) {
¡¡¡¡¡¡¡¡¡¡¡¡// ¤ª»È¤¤¤Î»þ´Ö¥Ç¡¼¥¿¤ò£±¤Ä¤º¤Ä½çÈ֤ˤ¹¤Ù¤Æ¥»¡¼¥Ö
SaveWorkingJobTimeData(workingJobTimeDatasList[i].jobNo);
}
////*¤³¤³¤Þ¤Ç *////
}
/// <summary>
/// ¥ª¥Õ¥é¥¤¥ó¤Ç¤Î»þ´Ö¤ò¥í¡¼¥É
/// </summary>
public void LoadOfflineDateTime() {
// ¥»¡¼¥Ö¥Ç¡¼¥¿¤¬¤¢¤ë¤«³Îǧ
if (PlayerPrefsHelper.ExistsData(SAVE_KEY_DATETIME)) {
// ¥»¡¼¥Ö¥Ç¡¼¥¿¤¬¤¢¤ë¾ì¹ç¡¢¥í¡¼¥É¤¹¤ë
string oldDateTimeString = PlayerPrefsHelper.LoadStringData(SAVE_KEY_DATETIME);
¡¡¡¡¡¡¡¡¡¡¡¡// ¥í¡¼¥É¤·¤¿Ê¸»úÎó¤ò DateTime ·¿¤Ë·¿ÊÑ´¹¤·¤Æ»þ´Ö¤ò¼èÆÀ
loadDateTime = DateTime.ParseExact(oldDateTimeString, FORMAT, null);
Debug.Log("¥²¡¼¥à³«»Ï»þ : ¥»¡¼¥Ö¤µ¤ì¤Æ¤¤¤¿»þ´Ö : " + oldDateTimeString);
Debug.Log("º£¤Î»þ´Ö : " + DateTime.Now.ToString(FORMAT));
} else {
// ¥»¡¼¥Ö¥Ç¡¼¥¿¤¬¤Ê¤¤¾ì¹ç¡¢¸½ºß¤Î»þ´Ö¤ò³«»Ï»þ¹ï¤È¤·¤Æ¼èÆÀ¤·¤Æ¤ª¤¯
loadDateTime = DateTime.Now;
Debug.Log("¥»¡¼¥Ö¥Ç¡¼¥¿¤¬¤Ê¤¤¤Î¤Çº£¤Î»þ´Ö¤ò¼èÆÀ : " + oldDateTime.ToString(FORMAT));
}
}
/// <summary>
/// ¸½ºß¤Î»þ´Ö¤ò¥»¡¼¥Ö
/// </summary>
public void SaveOfflineDateTime() {
¡¡¡¡¡¡¡¡// ¸½ºß¤Î»þ´Ö¤ò¼èÆÀ¤·¤Æ¡¢Ê¸»úÎó¤ËÊÑ´¹
string dateTimeString = DateTime.Now.ToString(FORMAT);
¡¡¡¡¡¡¡¡// string ·¿¤Ç¥»¡¼¥Ö
PlayerPrefsHelper.SaveStringData(SAVE_KEY_DATETIME, dateTimeString);
Debug.Log("¥²¡¼¥à½ªÎ»»þ : ¥»¡¼¥Ö»þ´Ö : " + dateTimeString);
}
/// <summary>
/// ¥ª¥Õ¥é¥¤¥ó¤Ç¤Î·Ð²á»þ´Ö¤ò·×»»
/// </summary>
public int CalculateOfflineDateTimeElasped(DateTime oldDateTime) {
// ¸½ºß¤Î»þ´Ö¤ò¼èÆÀ
DateTime currentDateTime = DateTime.Now;
// ¸½ºß¤Î»þ´Ö¤È¥»¡¼¥Ö¤µ¤ì¤Æ¤¤¤ë»þ´Ö¤ò³Îǧ
if (oldDateTime > currentDateTime) {
// ¥»¡¼¥Ö¥Ç¡¼¥¿¤Î»þ´Ö¤ÎÊý¤¬º£¤Î»þ´Ö¤è¤ê¤â¿Ê¤ó¤Ç¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢º£¤Î»þ´Ö¤òÆþ¤ì¤Ê¤ª¤¹
oldDateTime = DateTime.Now;
}
// ·Ð²á¤·¤¿»þ´Ö¤Îº¹Ê¬
TimeSpan dateTimeElasped = currentDateTime - oldDateTime;
// ·Ð²á»þ´Ö¤òÉäˤ¹¤ë(Math.Round ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¡¢double ·¿¤ò int ·¿¤ËÊÑ´¹¡£¾®¿ôÅÀ¤Ï 0 ¤Î°Ì¤Ç¡¢¿ôÃͤδݤá¤Î½èÍý¤Î»ØÄê¤Ï ToEven(¿ôÃͤ¬ 2 ¤Ä¤Î¿ôÃͤÎÃæ´Ö¤Ë°ÌÃÖ¤¹¤ë¤È¤¤Ë¡¢ºÇ¤â¶á¤¤¶ö¿ô¤ÎÃÍ) ¤ò»ØÄê)
elaspedTime = (int)Math.Round(dateTimeElasped.TotalSeconds, 0, MidpointRounding.ToEven);
Debug.Log($"¥ª¥Õ¥é¥¤¥ó¤Ç¤Î·Ð²á»þ´Ö : {elaspedTime } ÉÃ");
return elaspedTime;
}
/// <summary>
/// ³Æ¤ª»È¤¤¤Î»Ä¤ê»þ´Ö¤Î¹¹¿·
/// </summary>
/// <param name="jobNo"></param>
/// <param name="currentJobTime"></param>
public void UpdateCurrentJobTime(int jobNo, int currentJobTime) {
// List ¤«¤é³ºÅö¤Î JobTimeData ¤ò¸¡º÷¤·¤Æ¼èÆÀ¤·¡¢elaspedJobTime ¤ÎÃͤò currentJobTime ¤Ë¹¹¿·
workingJobTimeDatasList.Find(x => x.jobNo == jobNo).elaspedJobTime = currentJobTime;
}
/// <summary>
/// List ¤Ë JobTimeData ¤òÄɲᣤ³¤Î¥ê¥¹¥È¤Ë¤¢¤ë¾ðÊ󤬸½ºß¤ª»È¤¤¤ò¤·¤Æ¤¤¤ëÆâÍƤˤʤë
/// </summary>
/// <param name="jobTimeData"></param>
public void AddWorkingJobTimeDatasList(JobTimeData jobTimeData) {
// ¤ª»È¤¤¤ò List ¤ËÄɲ乤ëÁ°¤Ë¡¢¤¹¤Ç¤Ë¥ê¥¹¥È¤Ë¤¢¤ë¤«³Îǧ¤·¤Æ½ÅÊ£ÅÐÏ¿¤òËɤ°
if (!workingJobTimeDatasList.Exists(x => x.jobNo == jobTimeData.jobNo)) {
¡¡¡¡¡¡¡¡¡¡¡¡// List ¤Ë¤Ê¤¤¾ì¹ç¤Î¤ß¡¢¿·¤·¤¯Äɲ乤ë
workingJobTimeDatasList.Add(jobTimeData);
Debug.Log(jobTimeData.elaspedJobTime);
}
}
/// <summary>
/// ¸½ºß¤ª»È¤¤Ãæ¤Î JobTimeData ¤ÎºîÀ®¤È List ¤Ø¤ÎÄɲÃ
/// </summary>
/// <param name="tapPointDetail"></param>
public void CreateWorkingJobTimeDatasList(TapPointDetail tapPointDetail, int remainingTime) {
¡¡¡¡¡¡¡¡// ¤ª»È¤¤¤Î»Ä¤ê»þ´Ö¤òÀßÄê¡£-1 ¤Î¾ì¹ç¤Ï¤ª»È¤¤³«»Ï»þ¤Ê¤Î¤Ç¡¢¤ª»È¤¤»þ´Ö¤ò¤½¤Î¤Þ¤Þ¥»¥Ã¥È
¡¡¡¡¡¡¡¡// ¤½¤ì°Ê³°¤Ï¤ª»È¤¤¤ÎÅÓÃæ¤Ê¤Î¤Ç¡¢»Ä¤ê»þ´Ö¤ò¥»¥Ã¥È(¤½¤Î¤Þ¤Þ remainingTime ¤ò»È¤¦)
if (remainingTime == -1) {
remainingTime = tapPointDetail.jobData.jobTime;
}
// JobTimeData ¤ò½é´ü²½¤·¤ÆºîÀ®
JobTimeData jobTimeData = new JobTimeData { jobNo = tapPointDetail.jobData.jobNo, elaspedJobTime = remainingTime };
¡¡¡¡¡¡¡¡// List ¤Ë JobTimeData ¤òÄɲÃ
AddWorkingJobTimeDatasList(jobTimeData);
}
////*¤³¤³¤«¤é¥á¥½¥Ã¥É¤ò£±¤ÄÄɲà *////
/// <summary>
/// ¤ª»È¤¤¤Î»þ´Ö¤Î¥»¡¼¥Ö
¡¡¡¡/// ¤ª»È¤¤³«»Ï»þ¤È¥²¡¼¥à½ªÎ»»þ¤Ë¥»¡¼¥Ö
/// </summary>
/// <param name="jobNo"></param>
public void SaveWorkingJobTimeData(int jobNo) {
// ¥»¡¼¥ÖÂоݤΠJobTimeData ¤ò List ¤«¤é¸¡º÷¤·¤Æ¼èÆÀ
JobTimeData jobTimeData = workingJobTimeDatasList.Find(x => x.jobNo == jobNo);
// º£¤Î»þ´Ö¤ò¼èÆÀ¤·¤Æʸ»úÎó¤ËÊÑ´¹
jobTimeData.jobTimeString = DateTime.Now.ToString(FORMAT);
¡¡¡¡¡¡¡¡// ¤ª»È¤¤¤Î»þ´Ö¥Ç¡¼¥¿¤Î¥»¡¼¥Ö
PlayerPrefsHelper.SaveSetObjectData(WORKING_JOB_SAVE_KEY + jobTimeData.jobNo.ToString(), jobTimeData);
string str = DateTime.Now.ToString(FORMAT);
Debug.Log("»Å»öÃæ : ¥»¡¼¥Ö»þ´Ö : " + str);
Debug.Log("¥»¡¼¥Ö»þ¤Î¤ª»È¤¤¤Î»Ä¤ê»þ´Ö : " + jobTimeData.elespedJobTime);
}
////*¤³¤³¤Þ¤Ç *////
}
¡¡¥¹¥¯¥ê¥×¥È¤ò½¤Àµ¤·¤¿¤é¥»¡¼¥Ö¤·¤Þ¤¹¡£