【Unity+PlayFab】サーバーから現在時刻を超簡単に取得する方法

Unity/C#

環境

  • OS:Windows 10 Pro
  • Unity:6000.0.47f1

サーバー時間を利用したゲーム制作

ゲーム制作において、サーバー時間を使った仕様は様々な場面で活用されています。

  • ログインボーナス
  • 仮想通貨(スタミナ)の回復
  • 放置系の報酬の算出

デバイス時間を取得する場合は、「DateTime.Now」で取得可能です。しかし、これをゲーム内で利用すると簡単に不正できてしまうので、サーバー時間を利用することで防止することができます。

PlayFabを利用したサーバー時間の取得方法

この記事では、Unity+PlayFabでサーバー時間を取得する方法を紹介します。また、PlayFabについては以下の記事で詳しく解説しています。

PlayFabを利用することで、とても簡単にサーバー時間を取得することができます。ログイン処理後に「PlayFabClientAPI.GetTime」を呼び出し、「result.Time」で結果を取得できます。

/// <summary>
/// サーバー時間の取得
/// </summary>
public void GetTime() {
    PlayFabClientAPI.GetTime(new GetTimeRequest(),
        result =>
    {
        Debug.Log("サーバー時間の取得に成功しました");
        Debug.Log(result.Time);
    }, error =>
    {
        Debug.Log(error.GenerateErrorReport());
    });
}

時間がズレる

ログを見ると、日付は合っていますが時間が「2時20分」となっており、9時間ズレています。

これはサーバー時間が「協定世界時(UTC)」というもので管理されているためです。

協定世界時(UTC)

地球の自転に基づく時刻ではなく、原子時計による高精度な時間(国際原子時)を基に調整されたもの。UTCはタイムゾーンが「UTC±0」であり、世界各地の時刻はこのUTCを基準に「+」または「-」で表され、日本時間(JST)はUTC+9です。

DateTime構造体

取得した「result.Time」に9時間を足すことで正確な時間を取得することができますが、ここでは「DateTime構造体」について少し解説します。

様々な機能を持っていますが、今やりたいことは「時間足す」なので、「Add〇〇」という機能を使います。これらはゲーム制作において使い勝手のいい機能なので、覚えておくと効率良く制作を進めることができます。

namespace System {
    public readonly struct DateTime : IComparable, IComparable<DateTime>, IConvertible, IEquatable<DateTime>, IFormattable, ISerializable {
        public static readonly DateTime MaxValue;
        public static readonly DateTime MinValue;
        public static readonly DateTime UnixEpoch;

        ~省略~

        public DateTime Add(TimeSpan value);
        public DateTime AddDays(double value);
        public DateTime AddHours(double value);
        public DateTime AddMilliseconds(double value);
        public DateTime AddMinutes(double value);
        public DateTime AddMonths(int months);
        public DateTime AddSeconds(double value);
        public DateTime AddTicks(long value);
        public DateTime AddYears(int value);

        ~省略~
    }
}

ここでは、「AddHours」を使用します。9行目の「result.Time」を「result.Time.AddHours(9)」に書き換えてログで確認します。

/// <summary>
/// サーバー時間の取得
/// </summary>
public void GetTime() {
    PlayFabClientAPI.GetTime(new GetTimeRequest(),
        result =>
    {
        Debug.Log("サーバー時間の取得に成功しました");
        Debug.Log(result.Time.AddHours(9));
    }, error =>
    {
        Debug.Log(error.GenerateErrorReport());
    });
}

正確な時間を取得することに成功しました!

まとめ

PlayFabを利用してサーバーから現在時刻を取得する手順は以下の通り。

  1. PlayFabClientAPI.GetTime」を呼び出す
  2. 取得した「result.Time」に「.AddHours(9)」を追記して日本時間に合わせる

これを活用して新しいゲーム制作に取り組みましょう!

ゲ制最高!

コメント

タイトルとURLをコピーしました