この記事でのバージョン
Unity 2018.4.8f1
PlayFab SDK 2.77.191029
はじめに
今回はUnityでPlayFabの仮想通貨(ゲーム内通貨)を使ってみようという感じの記事です!
ちなみに、PlayFabとはなんぞや?という方は以下の記事を参照の事。
ざっくり言うとサーバーサイドが関わる事を楽して実装出来るサービスです。
しかも、無料で始める事も可能ですし、有料プランでも1000MAUまでは無料と
「ユーザが全然増えないのにお金だけ払う」みたいな事がありません。
なので個人開発でも使い始めやすいですし、Microsoftのサービスという安心感まであります。
Indie Plan、1,000 MAU まで無料だし、それを超えて有料になっても 100,000 MAU までは月額 $99 というお手頃価格なので個人や小規模なチームの開発にとても良いと思います🙂
— 南@エンジニア兼ティーアドバイザー (@_y_minami) 2019年11月14日
カジュアルなゲームなら機能制限がある代わりに MAU が何人でも完全無料の Essentials Plan でも良し☺️ https://t.co/TzPHB2g3ZR
なお、本記事は以下の導入やログイン処理が済んでいる前提になりますので、あしからず。
仮想通貨とは
そもそもPlayFabにおける仮想通貨とはゲーム内だけで使えるお金の事で、
いわゆるビットコイン的なものではないです。
仮想通貨は、ゲーム内の経済の基礎となります。 これらの通貨は、プレイヤーとキャラクターに付与することができます。これらの通貨を使って、商品の購入やトレードに使用することができます。 品目のコストは、仮想通貨または実際の金額のいずれかです。
ちなみにPaypalなどを使って現実のお金で仮想通貨を買うような実装も可能ですが、
今日の資料はここです。
— Simplestar@Unityゲーム開発 (@lpcwstr) 2019年10月22日
「PlayFab:現実のお金とゲーム内仮想通貨」https://t.co/iP7emG95ia#PlayFab Meetup #1
資金決済法など色々とややこしそうなので、今回はそれについては触れません。
仮想通貨の作成
仮想通貨の作成はブラウザ上で行います。
なお、Window/PlayFab/Editor Extensionsで開けるウィンドウの右上にある
GAME MANAGERをクリックすると、設定用のページを開けます。
作成箇所は左側にある「参加/エコノミー」の「通貨」タブにある「新しい通貨」です。
ここで適当に設定を行い「通貨を保存」を押せば、その通貨をゲーム内で利用する事が出来ます。
なお、それぞれの設定の意味については以下の通りです。
- 通貨コード : プログラム等で通貨を識別するためのもの(ちなみにRMは使えない)
- 表示名 : 通貨の名前
- 初期デポジット : 各プレイヤーが最初に持っている金額
- リチャージ レート : 1日で自動で増える金額
- リチャージ限度 : リチャージで取得出来る最大数?
仮想通貨の確認や配布
各ユーザが所持している仮想通貨はプレイヤーから対象のIDを選択し、
仮想通貨の欄をクリックすると確認出来ます。
ちなみにそこから直接変更する事も可能です。
また、全員または特定の人達に配布したい場合は、
「ビルド/自動化」にある「新しいスケジュール済みタスク」から、
以下のように配布対象や配布する仮想通貨とその額を選択し、「保存して実行」を行います。
仮想通貨の取得
ユーザが自分の所持している仮想通貨を取得したい場合は
まず、以前の記事で紹介したような感じでログイン処理を先に行います。
そしてその後、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上でも取得出来るのが分かると思います。
仮想通貨の追加
次に仮想通貨を追加する方法ですが、まず、ブラウザ上で以下のように設定する必要があります。
あとは取得と同様にログイン処理を先に行った後、
追加したい仮想通貨の額とコードを渡した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上で追加した金額がブラウザ上でも増えているのが分かると思います。
仮想通貨の消費
消費の場合も追加とほぼ同じで、ログイン処理を先に行った後、
消費したい仮想通貨の額とコードを渡した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上で減額した金額がブラウザ上でも減っているのが分かると思います。
おわりに
ゲーム内通貨の管理はPlayFab(というかサーバ)を使わずとも可能ですが、
PlayFabを使えばデータの改ざんが難しくなるので、お金を増やすといったチートも難しくなります。
また、好きなタイミングで特定のユーザにお金を配るという事も出来ますし、
「お金がどれぐらい持たれているか、使われているか」みたいな分析もしやすくなるので、
しっかりお金周りを管理したい場合、例えば運営型のゲームなどにはオススメの機能でした。
ちなみに以前紹介したカタログやアイテムの機能と組み合わせると、
「PlayFabで管理しているアイテムを、PlayFabで管理している仮想通貨で買う」
なんて事も簡単に出来るっぽいので、これもいずれ試して記事にしたいと思います!