(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



Unity+PlayFabで仮想通貨(ゲーム内通貨)を管理【Unity】【PlayFab】


このエントリーをはてなブックマークに追加



この記事でのバージョン
Unity 2018.4.8f1
PlayFab SDK 2.77.191029


はじめに

今回はUnityでPlayFabの仮想通貨(ゲーム内通貨)を使ってみようという感じの記事です!


ちなみに、PlayFabとはなんぞや?という方は以下の記事を参照の事。

ざっくり言うとサーバーサイドが関わる事を楽して実装出来るサービスです。



しかも、無料で始める事も可能ですし、有料プランでも1000MAUまでは無料

「ユーザが全然増えないのにお金だけ払う」みたいな事がありません。

なので個人開発でも使い始めやすいですし、Microsoftのサービスという安心感まであります。



なお、本記事は以下の導入やログイン処理が済んでいる前提になりますので、あしからず。





仮想通貨とは

そもそもPlayFabにおける仮想通貨とはゲーム内だけで使えるお金の事で、

いわゆるビットコイン的なものではないです。

仮想通貨は、ゲーム内の経済の基礎となります。 これらの通貨は、プレイヤーとキャラクターに付与することができます。これらの通貨を使って、商品の購入やトレードに使用することができます。 品目のコストは、仮想通貨または実際の金額のいずれかです。


ちなみにPaypalなどを使って現実のお金で仮想通貨を買うような実装も可能ですが、



資金決済法など色々とややこしそうなので、今回はそれについては触れません。


仮想通貨の作成

仮想通貨の作成はブラウザ上で行います。

なお、Window/PlayFab/Editor Extensionsで開けるウィンドウの右上にある

GAME MANAGERをクリックすると、設定用のページを開けます。

f:id:kan_kikuchi:20200105044438j:plain
f:id:kan_kikuchi:20200105044447j:plain


作成箇所は左側にある「参加/エコノミー」の「通貨」タブにある「新しい通貨」です。

f:id:kan_kikuchi:20200212141739j:plain


ここで適当に設定を行い「通貨を保存」を押せば、その通貨をゲーム内で利用する事が出来ます。

f:id:kan_kikuchi:20200212144341j:plain


なお、それぞれの設定の意味については以下の通りです。

  • 通貨コード : プログラム等で通貨を識別するためのもの(ちなみにRMは使えない)
  • 表示名 : 通貨の名前
  • 初期デポジット : 各プレイヤーが最初に持っている金額
  • リチャージ レート : 1日で自動で増える金額
  • リチャージ限度 : リチャージで取得出来る最大数?



仮想通貨の確認や配布

各ユーザが所持している仮想通貨プレイヤーから対象のIDを選択し、

f:id:kan_kikuchi:20200212144617j:plain


仮想通貨の欄をクリックすると確認出来ます。

f:id:kan_kikuchi:20200212144630j:plain


ちなみにそこから直接変更する事も可能です。

f:id:kan_kikuchi:20200212144642j:plain


また、全員または特定の人達に配布したい場合は、

「ビルド/自動化」にある「新しいスケジュール済みタスク」から、

f:id:kan_kikuchi:20200125110656j:plain


以下のように配布対象や配布する仮想通貨とその額を選択し、「保存して実行」を行います。

f:id:kan_kikuchi:20200212145051j:plain



仮想通貨の取得

ユーザが自分の所持している仮想通貨を取得したい場合

まず、以前の記事で紹介したような感じでログイン処理を先に行います。



そしてその後、GetUserInventoryRequestのインスタンスを生成し、

PlayFabClientAPI.GetUserInventoryにそれプラス、成功時と失敗時のデリゲートを渡すだけ。

(仮想通貨はアイテムと同様、イベントに入っている感じ)

using System.Collections;
using System.Collections.Generic;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;

/// <summary>
/// 仮想通貨のサンプル
/// </summary>
public class CurrenciesSample : MonoBehaviour{
  
  //=================================================================================
  //取得
  //=================================================================================
  
  /// <summary>
  /// インベントリの情報を取得
  /// </summary>
  public void GetUserInventory(){
    //GetUserInventoryRequestのインスタンスを生成
    var userInventoryRequest = new GetUserInventoryRequest();
    
    //インベントリの情報の取得
    Debug.Log($"インベントリの情報の取得開始");
    PlayFabClientAPI.GetUserInventory(userInventoryRequest, OnSuccess, OnError);
  }
  
  //=================================================================================
  //取得結果
  //=================================================================================
  
  //インベントリの情報の取得に成功
  private void OnSuccess(GetUserInventoryResult result){
    //result.Inventoryがインベントリの情報
    Debug.Log($"インベントリの情報の取得に成功");
    
    //所持している仮想通貨の情報をログで表示
    foreach(var virtualCurrency in result.VirtualCurrency){
      Debug.Log($"仮想通貨 {virtualCurrency.Key} : {virtualCurrency.Value}");
    }
  }

  //インベントリの情報の取得に失敗
  private void OnError(PlayFabError error){
    Debug.LogError($"インベントリの情報の取得に失敗\n{error.GenerateErrorReport()}");
  }

}


実際に使ってみると以下のような感じで、

ブラウザ上で確認出来る値と同じ物が、Unity上でも取得出来るのが分かると思います。

f:id:kan_kikuchi:20200212151946j:plain



仮想通貨の追加

次に仮想通貨を追加する方法ですが、まず、ブラウザ上で以下のように設定する必要があります。

f:id:kan_kikuchi:20200215085753j:plain


あとは取得と同様にログイン処理を先に行った後、

追加したい仮想通貨の額とコードを渡したAddUserVirtualCurrencyRequestのインスタンスを生成し、

PlayFabClientAPI.AddUserVirtualCurrencyにそれプラス、成功時と失敗時のデリゲートを渡すだけ。

using System.Collections;
using System.Collections.Generic;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;

/// <summary>
/// 仮想通貨のサンプル
/// </summary>
public class CurrenciesSample : MonoBehaviour{

  //=================================================================================
  //追加
  //=================================================================================
  
  /// <summary>
  /// 仮想通貨を追加
  /// </summary>
  public void AddUserVirtualCurrency(){
    //AddUserVirtualCurrencyRequestのインスタンスを生成
    var addUserVirtualCurrencyRequest = new AddUserVirtualCurrencyRequest {
      Amount          = 58,   //追加する金額
      VirtualCurrency = "KM", //仮想通貨のコード
    };
    
    //仮想通貨の追加
    Debug.Log($"仮想通貨の追加開始");
    PlayFabClientAPI.AddUserVirtualCurrency(addUserVirtualCurrencyRequest, OnSuccess, OnError);
  }
  
  //=================================================================================
  //追加結果
  //=================================================================================
  
  //仮想通貨の追加に成功
  private void OnSuccess(ModifyUserVirtualCurrencyResult result){
    Debug.Log($"仮想通貨の追加に成功");
    
    //仮想通貨の情報をログで表示
    Debug.Log($"変更した仮想通貨のコード : {result.VirtualCurrency}");
    Debug.Log($"変更後の残高 : {result.Balance}");
    Debug.Log($"加算額 : {result.BalanceChange}");
  }

  //仮想通貨の追加に失敗
  private void OnError(PlayFabError error){
    Debug.LogError($"仮想通貨の追加に失敗\n{error.GenerateErrorReport()}");
  }

}


実際に使ってみると以下のような感じで、

Unity上で追加した金額がブラウザ上でも増えているのが分かると思います。

f:id:kan_kikuchi:20200215092904g:plain



仮想通貨の消費

消費の場合も追加とほぼ同じで、ログイン処理を先に行った後、

消費したい仮想通貨の額とコードを渡したSubtractUserVirtualCurrencyRequestのインスタンスを生成し、

PlayFabClientAPI.SubtractUserVirtualCurrencyにそれプラス、成功時と失敗時のデリゲートを渡すだけ。

using System.Collections;
using System.Collections.Generic;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;

/// <summary>
/// 仮想通貨のサンプル
/// </summary>
public class CurrenciesSample : MonoBehaviour{

  //=================================================================================
  //減額
  //=================================================================================
  
  /// <summary>
  /// 仮想通貨を減らす
  /// </summary>
  public void SubtractUserVirtualCurrency(){
    //AddUserVirtualCurrencyRequestのインスタンスを生成
    var subtractUserVirtualCurrencyRequest = new SubtractUserVirtualCurrencyRequest {
      Amount          = 58,   //減らす金額
      VirtualCurrency = "KM", //仮想通貨のコード
    };
    
    //仮想通貨の減額
    Debug.Log($"仮想通貨の減額開始");
    PlayFabClientAPI.SubtractUserVirtualCurrency(subtractUserVirtualCurrencyRequest, OnSuccess, OnError);
  }
  
  //=================================================================================
  //減額結果
  //=================================================================================
  
  //仮想通貨の減額に成功
  private void OnSuccess(ModifyUserVirtualCurrencyResult result){
    Debug.Log($"仮想通貨の減額に成功");
    
    //仮想通貨の情報をログで表示
    Debug.Log($"変更した仮想通貨のコード : {result.VirtualCurrency}");
    Debug.Log($"変更後の残高 : {result.Balance}");
    Debug.Log($"減額した額 : {result.BalanceChange}");
  }

  //仮想通貨の減額に失敗
  private void OnError(PlayFabError error){
    Debug.LogError($"仮想通貨の減額に失敗\n{error.GenerateErrorReport()}");
  }

}


実際に使ってみると以下のような感じで、

Unity上で減額した金額がブラウザ上でも減っているのが分かると思います。

f:id:kan_kikuchi:20200215093032g:plain



おわりに

ゲーム内通貨の管理はPlayFab(というかサーバ)を使わずとも可能ですが、

PlayFabを使えばデータの改ざんが難しくなるので、お金を増やすといったチートも難しくなります。


また、好きなタイミングで特定のユーザにお金を配るという事も出来ますし、

「お金がどれぐらい持たれているか、使われているか」みたいな分析もしやすくなるので、

しっかりお金周りを管理したい場合、例えば運営型のゲームなどにはオススメの機能でした。


ちなみに以前紹介したカタログやアイテムの機能と組み合わせると、



「PlayFabで管理しているアイテムを、PlayFabで管理している仮想通貨で買う」

なんて事も簡単に出来るっぽいので、これもいずれ試して記事にしたいと思います!