起こったこと
久方ぶりに「GS2 SDK for Unity」のバージョンアップを行いました。
(2023.8.13へバージョンアップ)
すると…ガチャ機能で使用しているShowcaseの処理で、今まで使用していた以下の処理でコンパイルエラーが発生するように。
/// <summary>
/// 抽選商品を購入する
/// Purchase Lottery Items
/// </summary>
public IEnumerator Buy(
Gs2Domain gs2,
GameSession gameSession,
string showcaseNamespaceName,
string showcaseName,
string displayItemId,
AcquireInventoryItemEvent onAcquireInventoryItem,
ErrorEvent onError,
List<EzConfig> config
)
{
var tempConfig = new List<EzConfig>(config);
void LotteryResult(
string _namespace,
string lotteryName,
DrawnPrize[] prizes
)
{
// 抽選処理の結果を取得
// Obtain the results of the lottery process
// 抽選で獲得したアイテム
// Items won in the lottery
var DrawnPrizes = new List<EzDrawnPrize>();
foreach (var prize in prizes)
{
var item = EzDrawnPrize.FromModel(prize);
DrawnPrizes.Add(item);
}
onAcquireInventoryItem.Invoke(
DrawnPrizes
);
}
// 抽選結果取得コールバックを登録
// Register lottery result acquisition callback
Gs2Lottery.Domain.Gs2Lottery.DrawnResult = LotteryResult; ※ここと
// 商品の購入をリクエスト
// Request to purchase an item
var domain = gs2.Showcase.Namespace(
namespaceName: showcaseNamespaceName
).Me(
gameSession: gameSession
).Showcase(
showcaseName: showcaseName
);
var future = domain.Buy( ※ここでエラー
displayItemId: displayItemId,
config: tempConfig.ToArray()
);
yield return future;
if (future.Error != null)
{
onError.Invoke(
future.Error,
null
);
}
}
原因
SDKバージョンアップ後、Gs2Lottery.Domain.Gs2LotteryではDrawnResultが消えてDrawByUserIdCompleteに変更、
Buyを呼び出すメソッドがEzShowcaseGameSessionDomainではなくEzDisplayItemGameSessionDomainへ移動となりました。
SDK新バージョン用に以下修正
UnityEvent<string, DrawByUserIdRequest, DrawByUserIdResult> LotteryResult; //UnityEvent用に追加
/// <summary>
/// 抽選商品を購入する
/// Purchase Lottery Items
/// </summary>
public async UniTask BuyAsync(
Gs2Domain gs2,
GameSession gameSession,
string showcaseNamespaceName,
string showcaseName,
string displayItemId,
AcquireInventoryItemEvent onAcquireInventoryItem,
ErrorEvent onError,
List<EzConfig> config
)
{
var tempConfig = new List<EzConfig>(config);
// 抽選処理の結果を取得
LotteryResult.RemoveListener(DrawResult);
/// <summary>
/// ガチャ結果を取得した後の処理
/// </summary>
/// <param name="arg0"></param>
/// <param name="request"></param>
/// <param name="result"></param>
void DrawResult(string arg0, DrawByUserIdRequest request, DrawByUserIdResult result)
{
var DrawnPrizes = new List<EzDrawnPrize>();
DrawnPrize[] prizes = result.Items;
foreach (var prize in prizes)
{
var item = EzDrawnPrize.FromModel(prize);
DrawnPrizes.Add(item);
}
onAcquireInventoryItem.Invoke(
DrawnPrizes
);
}
LotteryResult.AddListener(DrawResult);
// 抽選結果取得コールバックを登録
// Register lottery result acquisition callback
Gs2.Gs2Lottery.Domain.Gs2Lottery.DrawByUserIdComplete = LotteryResult;
// 商品の購入をリクエスト
// Request to purchase an item
var domain = gs2.Showcase.Namespace(
namespaceName: showcaseNamespaceName
).Me(
gameSession: gameSession
).Showcase(
showcaseName: showcaseName
).DisplayItem(
displayItemId: displayItemId
); //DisplayItemまで設定
try
{
//購入
var future = await domain.BuyAsync(
quantity: null,
config: tempConfig.ToArray()
);
if (future == null)
{
UIManager.Instance.OpenDialog1("エラー", "Failed");
UIManager.Instance.CloseProcessing();
}
UIManager.Instance.CloseProcessing();
}
catch(TransactionException te)
{
onError.Invoke(te, null);
await te.Retry();
return;
}
catch (Gs2Exception e)
{
onError.Invoke(e, null);
return;
}
}
domainに入れている部分の処理は、以下ドキュメント側も更新されていました。
https://docs.gs2.io/ja/api_reference/showcase/game_engine/#buy
見慣れない型が引数に追加されたUnityEventに代わっていたり、
メソッドの実装箇所が変わったりで最初は焦りましたがドキュメント読み返したり実装を追うことでなんとか元の動作に戻せました。
バージョンアップ前に変更点を要確認。