gamebox
【unity】放置ゲーム/ソシャゲ系のオフライン報酬1【スクリプト】
https://www.unitygamebox.com/?p=716
21.OfflineTimeManager スクリプトを作成する
・シングルトンデザインパターンによるクラスの作成 ・DontDestroyOnLoad メソッド ・const 修飾子 ・DateTime 構造体と DateTime.Now プロパティ ・DateTime.ParseExact メソッド ・MonoBehaviour.OnApplicationQuit メソッド ・Math.Round メソッドと MidpointRounding 列挙(enum)型 ・TimeSpan 構造体と TimeSpan.TotalSeconds プロパティ
1.ゲームを実行する。セーブされている時間のデータがない場合には、現在の時刻をゲーム時間としてセットする セーブされている時間のデータがある場合には、そのデータをロードする 2.ロードした「前回ゲームを終了したときの時間」と「現在の時間」とを計算して、「差分値」を算出する この差分値が「前回ゲームを終了してから、今回ゲームを再開するまでの経過した時間」となる 3.次の手順ではこの「経過した時間」を活用していく 4.ゲームを終了したタイミングで現在の時間をセーブする。この値が次回ゲームを開始した際の「前回ゲームを終了したときの時間」となる
1.ゲームを実行する。セーブされている時間のデータがない場合には、現在の時刻をゲーム時間としてセットする // LoadOfflineDateTime メソッド セーブされている時間のデータがある場合には、そのデータをロードする 2.ロードした「前回ゲームを終了したときの時間」と「現在の時間」とを計算して、「差分値」を算出する // CalculateOfflineDateTimeElasped メソッド この差分値が「前回ゲームを終了してから、今回ゲームを再開するまでの経過した時間」となる 3.次の手順ではこの「経過した時間」を活用していく 4.ゲームを終了したタイミングで現在の時間をセーブする。この値が次回ゲームを開始した際の「前回ゲームを終了したときの時間」となる // OnApplicationQuit メソッドと SaveOfflineDateTime メソッド
public static OfflineTimeManager instance; // クラス名と同名の型を static で宣言する private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } }
OfflineTimeManager という指定はすなわち、自動的にただ1つの OfflineTimeManager クラスの参照が行われることになるためです。
DontDestroyOnLoad(gameObject);
Unity公式スクリプトリファレンス
Object.DontDestroyOnLoad
https://docs.unity3d.com/ja/current/ScriptReferenc...
private const string SAVE_KEY_DATETIME = "OfflineDateTime"; // 時間をセーブ・ロードする際の変数。定数として宣言する private const string FORMAT = "yyyy/MM/dd HH:mm:ss"; // 日時のフォーマット指定用
[Header("前回ゲームを止めた時にセーブしている時間")] public DateTime oldDateTime = new DateTime(); // new キーワードを利用して初期化。コンストラクタに代入していないので、規定値が代入される
Debug.Log("今の時間 : " + DateTime.Now.ToString(FORMAT)); // FORMAT 変数には、表示形式が指定されている。const 修飾子の変数を確認してみてください。
2021/04/01 10:15:30 // "yyyy/MM/dd HH:mm:ss" フォーマットで指定している形式で表示される
MicroSoft
DateTime 構造体
https://docs.microsoft.com/ja-jp/dotnet/api/system...
.NET Column 様
【C#の基礎】DateTimeによる現在時刻の取得とフォーマットの比較
https://www.fenet.jp/dotnet/column/language/2152/
// ロードした文字列を DateTime 型に型変換して時間を取得 oldDateTime = DateTime.ParseExact(oldDateTimeString, FORMAT, null);
MicroSoft
DateTime.ParseExact メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system...
SAMURAI ENGINEER Blog 様
【C#入門】日時の文字列をDateTimeに変換する方法(Parse/ParseExact)
https://www.sejuku.net/blog/51183
/// <summary> /// ゲームが終了したときに自動的に呼ばれる /// </summary> private void OnApplicationQuit() { // 現在の時間のセーブ SaveOfflineDateTime(); Debug.Log("ゲーム中断。時間のセーブ完了"); }
Round(Double, Int32, MidpointRounding)
// 経過時間を秒にする(Math.Round メソッドを利用して、double 型を int 型に変換。小数点は 0 の位で、数値の丸めの処理の指定は ToEven(数値が 2 つの数値の中間に位置するときに、最も近い偶数の値) を指定) elaspedTime = (int)Math.Round(dateTimeElasped.TotalSeconds, 0, MidpointRounding.ToEven);
MicroSoft
Math.Round メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system...
DelftStack 様
C# で Double を Int に変換する
https://www.delftstack.com/ja/howto/csharp/covert-...
MicroSoft
MidpointRounding 列挙型
https://docs.microsoft.com/ja-jp/dotnet/api/system... ToEven
// 経過した時間の差分(この時点では、yyyy/MM/dd HH:mm:ss の値になっている) TimeSpan dateTimeElasped = currentDateTime - oldDateTime; // 経過時間を秒にする(Math.Round メソッドを利用して、double 型を int 型に変換。小数点は 0 の位で、数値の丸めの処理の指定は ToEven(数値が 2 つの数値の中間に位置するときに、最も近い偶数の値) を指定) elaspedTime = (int)Math.Round(dateTimeElasped.TotalSeconds, 0, MidpointRounding.ToEven);
MicroSoft
TimeSpan 構造体
https://docs.microsoft.com/ja-jp/dotnet/api/system...
MicroSof
TimeSpan.TotalSeconds プロパティ
https://docs.microsoft.com/ja-jp/dotnet/api/system...