Edited at

[Unity]シンプルな期間限定機能作成(DateTimeの利用メモー)


クライアントのみでの処理

TimeLimit.csコンポネント作成

public class TimeLimit : MonoBehaviour

{
/// <summary>
/// 限定日にち
/// </summary>
[SerializeField]
private LimitedTime limitedtime;
/// <summary>
/// アンインストールしないまま更新時のチェック用
/// </summary>
[SerializeField]
private int keycode;
[SerializeField]
private GameObject description;
private void Start()
{
//違うキーなら期間切れ設定を更新する。
if(PlayerPrefs.GetInt("keycode", -1) != keycode)
{
PlayerPrefs.SetInt("keycode", keycode);
PlayerPrefs.SetString("HasExpired", "false");
}
//起動時、期間内時チェック
if (PlayerPrefs.GetString("HasExpired", "false") == "false")
{
//期間切れ処理
if (HasExpired(limitedtime))
PlayerPrefs.SetString("HasExpired", "true");
}
//期間切れ処理
if (PlayerPrefs.GetString("HasExpired", "false") == "true")
description.SetActive(true);
//期間内処理
else
SceneManager.LoadScene("Main");
}
/// <summary>
/// 期間切れかどうかを返す
/// true:期間切れ、false:期間内
/// </summary>
private bool HasExpired(LimitedTime limit)
{
//現在の UTC 日時
var now = DateTime.UtcNow;
//限定日時取得
var limitdate = GetDateTime(limit);
//残り日時処理
var remaining = limitdate - now;
//残り日数チェック
if (remaining.TotalDays < 0)
return true;
return false;
}
/// <summary>
/// DateTimeを返す
/// 日にち範囲外の処理をする。
/// </summary>
private DateTime GetDateTime(LimitedTime limit){
//limit.year年範囲外処理
var year = Mathf.Clamp(limit.year, 2018, 2028);
//limit.month月範囲外処理
var month = Mathf.Clamp(limit.month, 1, 12);
//limit.month月の日数を取得
var days = DateTime.DaysInMonth(limit.year, limit.month);
//日範囲外処理
var day = Mathf.Clamp(limit.day, 1, days);
return new DateTime(year, month, day);
}
}
[Serializable]
public class LimitedTime
{
[Range(2019, 2028)]
public int year;
[Range(1, 12)]
public int month;
[Range(1, 31)]
public int day;
}

シーン上GameObject作成し、TimeLimitコンポネントを追加しYear/Month/Dayを指定。

Keycode -1以外の整数を入力

Descriptionには表示させるGameObjectをアタッチ

1.png