UnityでPlayFabでxsollaするSDKの修正

# やりたいこと

クレジットカードやPayPalやWebMoneyで100円のアイテムを変えるようにする。
要はこのドキュメントにあることをしたかっただけです。

https://developers.xsolla.com/ja/sdk/game-engines/unity/#unity_sdk

ただ各々のバージョンが合わないのか、ドキュメントに従っただけでは達成できなかったので覚書しておきます。

# URLが奇形ですエラー

最初に、SDKに入っているLoginシーンを再生するとサンプルとして用意されているストアに接続できます。
ここは問題ありません。

そこで、自身で作成したタイトルのIDやAPIキーやアイテムを設定して再生し、
ログインが完了するといきなりエラーが出ます。

Curl error 3: <url> malformed

これはPlayFabに設定しているアイテムの"アイテム イメージ URI"を設定していないためです。
適当に半角スペースでも入れるかURIを設定すれば解決します。


# エラーコード　0004-0008

仮想通過で購入ができても、実際の通貨で購入しようとすると以下のページが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703909/4249f77b-8b46-b95c-42c5-61711656b0ac.png)


>サンドボックスの設定なのに本番にアクセスしているか
本番の設定なのにサンドボックスにアクセスしています。

らしいです。サンドボックスしたいです。
原因がどこにあったかというと、
PlayFabでリビジョンを編集した部分に、サンドボックスかどうかの引数を受け取る部分がありますが。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703909/00100f19-bba7-5ef7-f9a3-29d96a19d5b2.png)

xsollaのソースコードの方で、CloudScriptArgsクラスがargs.sandboxを送れる構成になっていませんでした。

```cs
[Serializable]
public class CloudScriptArgs
{
	public string sku;
	public uint amount;
	public string orderId;
	public string sdkTag;
	public string theme;
	public int sandbox;	// これが必要
}
```


ExecuteCloudScriptメソッドの中身も追加修正します。

```cs
				FunctionName = CLOUD_SCRIPT_DEMO_METHOD,
				FunctionParameter = new CloudScriptRequestEntity.CloudScriptArgs
				{
					sku = itemId,
					amount = ITEMS_QUANTITY_FOR_CLOUD_SCRIPT,
					orderId = orderId,
					sdkTag = PaymentsHelper.GetAdditionalInformation("playfab"),
					theme = PaystationThemeHelper.ConvertToSettings(XsollaSettings.PaystationTheme),
					sandbox = XsollaSettings.IsSandbox ? 1 : 0, // これが必要
				}
```

# 通過単位を円にしたい

そのままではドル単位で表示されます。やっぱり円にしたいです。
悲しいことに円表記の扱いはデフォルトには含まれていません。
RegionalCurrencyクラスを追加修正します。

```cs
		static readonly Dictionary<SystemLanguage, CurrencyProperties> Currencies =
			new Dictionary<SystemLanguage, CurrencyProperties>()
			{
				{SystemLanguage.Chinese, new CurrencyProperties {Symbol = "元", Code = "CNY"}},
				{SystemLanguage.English, new CurrencyProperties {Symbol = "$", Code = "USD"}},
				{SystemLanguage.French, new CurrencyProperties {Symbol = "€", Code = "EUR"}},
				{SystemLanguage.German, new CurrencyProperties {Symbol = "€", Code = "EUR"}},
				{SystemLanguage.Korean, new CurrencyProperties {Symbol = "₩", Code = "KRW"}},
				{SystemLanguage.Portuguese, new CurrencyProperties {Symbol = "R$", Code = "BRL"}},
				{SystemLanguage.Russian, new CurrencyProperties {Symbol = "₽", Code = "RUB"}},
				{SystemLanguage.Spanish, new CurrencyProperties {Symbol = "€", Code = "EUR"}},
				{SystemLanguage.Unknown, new CurrencyProperties {Symbol = "$", Code = "USD"}},
				{SystemLanguage.Japanese, new CurrencyProperties {Symbol = "¥", Code = "JPY"}},
			};
```

あとは小数表記が不要なので整数表記にします。
ItemUIクラスのToString("F2")などのF2を取ったりします。

# 課金のページが少し小さい

なぜか0.9かけたりしているので適宜修正する。

```cs
	private int GetActualWidth(int width)
	{
		return Mathf.Min(width, (int)(CanvasWidth * 0.9F));
	}
```

# 通貨バンドルを購入するとエラーが出る

カタログを弄りまくっていると表示されたので、
設定を間違えているだけの可能性があります。

PlayFabでは通貨も１つのバンドルとして販売するのですが、
サンプルでは通貨のバンドルはインベントリに表示しない処理になっているようです。
しかし、その表示しない処理はただnullを返しているだけなので、
受け取った方は存在するものとして処理しようとします。

とりあえずUserInventoryクラスの以下を修正し、null以外のものを取り込みます。

```cs
        _demoImplementation.GetInventoryItems(items =>
        {
            Items = items.Where(i => i != null).ToList();
            UpdateItemsEvent?.Invoke(Items);
        }, onError);
```



# その他

PlayFabとxsollaで同じアイテムIDで金額設定を間違えてしまうと、
PlayFabのカタログ画面とxsollaの決済画面で異なる金額表示になってしまい、運営としてまずいことになります。
このあたりも統合できると思っていたのですが、どうやるのでしょうか。