Unity SDKでFlowとペイウォールビルダーを使ったアプリ内課金を有効にする

このガイドでは、Adapty Unity SDK v4(ベータ版)の API を使用しています。v3 をお使いの場合は、対応するメソッド名についてマイグレーションガイドをご確認ください。

アプリ内課金を有効にするには、3 つの重要な概念を理解する必要があります。

  • プロダクト – ユーザーが購入できるもの(サブスクリプション、消耗型アイテム、永続アクセス)
  • フロー & ペイウォール – ノーコードのフロー & ペイウォールビルダーで作成した、プロダクトをユーザーに提示する画面。SDK は GetFlow を使って取得します。UI を自分のコードで構築したい場合は、カスタムペイウォールの実装を参照してください。
  • プレースメント – アプリ内でフロー & ペイウォールを表示する場所とタイミング(main、onboarding、settings など)。ダッシュボードでプレースメントに紐付けた後、コード内でプレースメント ID を指定して呼び出します。これにより、A/B テストの実施や、ユーザーごとに異なるペイウォールの表示が簡単にできます。

Adapty では、アプリ内で購入を有効にする 3 つの方法を提供しています。アプリの要件に応じて選択してください。

実装方法複雑さ使用するケース
Adapty フロー&ペイウォールビルダー✅ 簡単ノーコードビルダーで購入可能なフローまたはペイウォールを作成します。Adapty が自動的にレンダリングし、複雑な購入ロジック、レシート検証、サブスクリプション管理をすべて裏側で処理します。
カスタムペイウォール🟡 中程度ペイウォールの UI をアプリのコードで実装しますが、プロダクト提供の柔軟性を保つために Adapty からフローオブジェクトを取得します。ガイドを参照してください。
オブザーバーモード🔴 難しい独自の購入処理インフラがすでにあり、そのまま使い続けたい場合に使用します。なお、オブザーバーモードには Adapty での制限があります。記事を参照してください。
Important

以下の手順では、Adapty フロー&ペイウォールビルダーで作成したフローまたはペイウォールの実装方法を説明します。

ペイウォールのUIを自分でビルドする場合は、カスタムペイウォールの実装を参照してください。

Adapty フロー&ペイウォールビルダーで作成したフローまたはペイウォールをアプリに表示するには、コード上で以下の操作を行うだけです。

  1. フローまたはペイウォールを取得する: Adaptyから取得します。
  2. 表示するだけで、購入処理はAdaptyが行います: アプリにビューを表示します。
  3. ボタンのアクションを処理する: ユーザーの操作とアプリのレスポンスを紐付けます。たとえば、ユーザーがボタンをタップしたときにリンクを開いたり、ペイウォールを閉じたりします。

始める前に

始める前に、以下の手順を完了してください:

  1. Adapty ダッシュボードでアプリを App Store および/または Google Play に接続する。
  2. Adapty でプロダクトを作成する。
  3. フローまたはペイウォールを作成し、プロダクトを追加する。
  4. プレースメントを作成し、フローまたはペイウォールを追加する。
  5. アプリのコードに Adapty SDK をインストールして有効化する。
Tip

これらの手順を最も素早く完了するには、クイックスタートガイドに従うか、Developer CLIを使用してフローとプレースメントを作成してください。

1. フローまたはペイウォールを取得する

フローとペイウォールは、ダッシュボードで設定されたプレースメントに関連付けられています。プレースメントを使用すると、異なるオーディエンスに対して異なるフローやペイウォールを表示したり、A/B テストを実行したりできます。

Adapty Flow & Paywall Builder で作成したフローまたはペイウォールを取得するには、次の手順を行います:

  1. GetFlow メソッドを使用して、プレースメント ID から flow オブジェクトを取得します。

  2. CreateFlowView メソッドを使ってフロービューを作成します。ビューには、表示に必要な UI 要素とスタイルが含まれています。フローにビューが設定されていない場合、CreateFlowView はエラーを返します。コールバックでエラーを処理してください。

Important

ビューを取得するには、フローまたはペイウォールを公開してください。未公開の編集がある場合、フローまたはペイウォールのステータスは Dirty となり、そのプレースメントでは最後に公開されたバージョンが引き続き提供されます。

Adapty.GetFlow("YOUR_PLACEMENT_ID", (flow, error) => {
    if (error != null) {
        // handle the error
        return;
    }

    // Create the flow view
    AdaptyUI.CreateFlowView(flow, (view, error) => {
        if (error != null) {
            // the flow has no view configured, or view creation failed
            return;
        }

        // view - the flow view ready to be presented
    });
});
Info

このクイックスタートでは、フローまたはペイウォールを表示するために必要な最小限の設定について説明します。詳細な設定については、フローとペイウォールの取得に関するガイドをご覧ください。

2. フローまたはペイウォールを表示する

フロービューを取得したら、あとは数行追加するだけで表示できます。

フローを表示するには、CreateFlowView メソッドで作成した view に対して view.Present() メソッドを呼び出します。各 view は一度しか使用できません。閉じた後にフローを再度表示するには、CreateFlowView を再度呼び出してください。

view.Present((error) => {
    // handle the error
});
Info

フローやペイウォールの表示方法の詳細については、ガイドをご覧ください。

3. ボタンアクションの処理

フローまたはペイウォールでユーザーがボタンをクリックすると、Unity SDK は購入と復元を自動的に処理します。ただし、それ以外のボタンにはカスタムまたは事前定義された ID があり、コード内でアクションを処理する必要があります。

たとえば、ペイウォールには通常、閉じるボタンや開くべき URL(利用規約やプライバシーポリシーなど)があります。これらのアクションを処理するには、クラスに IAdaptyFlowsEventsListener インターフェースを実装し、リスナーとして登録する必要があります。

フローは購入完了後も表示されたままになります。購入完了後にフローを閉じたい場合は、FlowViewDidFinishPurchase コールバック内でビューを非表示にしてください。

Tip

ボタンのアクションとイベントの処理方法については、ガイドをご参照ください。

public class YourClass : MonoBehaviour, IAdaptyFlowsEventsListener
{
    void Start()
    {
        // Register this class as the flows events listener
        Adapty.SetFlowsEventsListener(this);
    }

    // IAdaptyFlowsEventsListener method - handles button actions
    public void FlowViewDidPerformAction(
        AdaptyUIFlowView view,
        AdaptyUIUserAction action
    ) {
        switch (action.Type) {
            case AdaptyUIUserActionType.Close:
                view.Dismiss(null);
                break;
            case AdaptyUIUserActionType.OpenUrl:
                AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
                break;
            default:
                break;
        }
    }

    // IAdaptyFlowsEventsListener method - dismiss the flow after a purchase
    public void FlowViewDidFinishPurchase(
        AdaptyUIFlowView view,
        AdaptyPaywallProduct product,
        AdaptyPurchaseResult purchasedResult
    ) {
        if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
            view.Dismiss(null);
        }
    }
}

次のステップ

Tip

ご質問やお困りのことがあれば、サポートフォーラムをご覧ください。よくある質問への回答を見つけたり、ご自身の質問を投稿することができます。チームとコミュニティがサポートいたします!

フローまたはペイウォールをアプリで表示する準備が整いました。App Store サンドボックスまたはGoogle Play Storeでテスト購入を行い、フローからテスト購入を完了できることを確認してください。

次に、ユーザーのアクセスレベルを確認して、適切なユーザーにペイウォールを表示したり、有料機能へのアクセスを付与したりできるようにする必要があります。

完全な実装例

以下は、すべての手順をアプリに統合した場合の例です。

using System;
using System.Collections.Generic;
using UnityEngine;
using AdaptySDK;

public class FlowManager : MonoBehaviour, IAdaptyFlowsEventsListener
{
    [SerializeField] private string placementId = "YOUR_PLACEMENT_ID";

    void Start()
    {
        // Register for flow events
        Adapty.SetFlowsEventsListener(this);
        GetAndDisplayFlow();
    }

    private void GetAndDisplayFlow()
    {
        Adapty.GetFlow(placementId, (flow, error) => {
            if (error != null) {
                Debug.LogError("Error getting flow: " + error.Message);
                return;
            }

            CreateAndPresentFlowView(flow);
        });
    }

    private void CreateAndPresentFlowView(AdaptyFlow flow)
    {
        AdaptyUI.CreateFlowView(flow, (view, error) => {
            if (error != null) {
                // the flow has no view configured — use custom logic
                Debug.LogError("Error creating flow view: " + error.Message);
                return;
            }

            view.Present((presentError) => {
                if (presentError != null) {
                    Debug.LogError("Error presenting flow: " + presentError.Message);
                    return;
                }

                Debug.Log("Flow presented successfully");
            });
        });
    }

    // IAdaptyFlowsEventsListener implementation
    public void FlowViewDidPerformAction(
        AdaptyUIFlowView view,
        AdaptyUIUserAction action
    ) {
        switch (action.Type) {
            case AdaptyUIUserActionType.Close:
                Debug.Log("Close button pressed");
                view.Dismiss(null);
                break;
            case AdaptyUIUserActionType.OpenUrl:
                AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
                break;
            default:
                break;
        }
    }

    public void FlowViewDidFinishPurchase(
        AdaptyUIFlowView view,
        AdaptyPaywallProduct product,
        AdaptyPurchaseResult purchasedResult
    ) {
        if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
            view.Dismiss(null);
        }
    }

    // Required interface methods (implement as needed)
    public void FlowViewDidAppear(AdaptyUIFlowView view) { }
    public void FlowViewDidDisappear(AdaptyUIFlowView view) { }
    public void FlowViewDidSelectProduct(AdaptyUIFlowView view, string productId) { }
    public void FlowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) { }
    public void FlowViewDidFailPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
    public void FlowViewDidStartRestore(AdaptyUIFlowView view) { }
    public void FlowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) { }
    public void FlowViewDidFailRestore(AdaptyUIFlowView view, AdaptyError error) { }
    public void FlowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) { }
    public void FlowViewDidFailLoadingProducts(AdaptyUIFlowView view, AdaptyError error) { }
    public void FlowViewDidFinishWebPaymentNavigation(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
    public void FlowViewDidReceiveAnalyticEvent(AdaptyUIFlowView view, string name, IDictionary<string, object> @params) { }

    public void ShowFlow()
    {
        GetAndDisplayFlow();
    }
}