ダイアログ API — MRTK3

] ダイアログ

ダイアログは、コンテキスト アプリ情報を提供する有効期間の短い UI ビューです。 多くの場合、ユーザーに何らかのアクションを要求し、その結果を非同期タスクまたは結果でアプリのビジネス ロジックに返します。 ダイアログを使用して、アクションを完了する前に重要な情報をユーザーに通知したり、確認を要求したりします。

MRTK3 UXCore には、 IDialog API と基本的な Dialog 実装と、インスタンスを生成および管理するための DialogPool が用意されています。 このドキュメントでは、ビジネス ロジックからのダイアログを表示するためのコード駆動型 fluent API について説明します。 UX コンポーネント パッケージに含まれるプレハブのドキュメントについては、 こちらのダイアログ プレハブのドキュメントを参照してください。

使用方法

シーンまたは UI 階層のどこかに DialogPool を配置します。 必要に応じて、シングルトン、マネージャー、またはその他のパターンを使用して、独自のグローバル DialogPool 参照を管理できます。 MRTK 自体は、グローバル DialogPool 参照を維持する方法に関する意見を示しませんが、参照されるダイアログ ビュー プレハブがビルドに含まれるように、コンポーネントはシーン内のどこかにある必要があります。

DialogPool パッケージがインストールされている場合は、プレハブ参照が標準の UX コンポーネント CanvasDialog.prefab に自動的に設定されます。 UX コンポーネントの標準 CanvasDialog.prefabの詳細については、 こちらのドキュメントを参照してください。

DialogPool参照を取得したら、fluent スタイルのビルダー API を使用してダイアログを構成して表示できます。

dialogPool.Get()
    .SetHeader("This is the Dialog's header.")
    .SetBody("You can specify the dialog's body text here.")
    .SetPositive("The positive button's label.", (args) => { /* Do thing! */ })
    .Show()

ビルダー API の呼び出しで指定されたサブコントロールのみが、reuslting Dialog に表示されます。 たとえば、上記のコード サンプルでは、ヘッダー テキストと本文テキストの両方を含むダイアログが生成されますが、正の選択ボタンは 1 つだけです。 さらにメソッド呼び出しをチェーンすることで、追加のボタンを指定できます。

// This dialog will show all three buttons.
dialogPool.Get()
    .SetHeader("A header.")
    .SetBody("Foobarbaz!")
    .SetPositive("The positive button's label.", (args) => { /* Do thing! */ })
    .SetNegative("The negative button's label.", (args) => { /* Do another thing! */ })
    .SetNeutral("A neutral option, too!", (args) => { /* Do some neutral thing. */ })
    .Show()

ボタンコールバックを介して渡される argsDialogButtonEventArgsされます。これには、イベントを生成した IDialog への参照と、ユーザーが選択したボタンの DialogButtonType の両方が含まれます。

ユーザーが決定を下す前に、ダイアログが外部で無視される可能性があります。 これは、別のダイアログが開かれているか、ダイアログがコードで手動で閉じられた場合に発生する可能性があります。 この場合、 SetPositive() に指定されたコールバックは呼び出されません。 外部の無視を含むダイアログのイベントをリッスンする場合は、 OnDismissed コールバックをリッスンできます。

var dialog = dialogPool.Get()?SetBody("Foobar!");
dialog.OnDismissed += (args) => { /* do things! */ };
dialog.Show();

OnDismissedは、ユーザーが選択した場合はDialogButtonEventArgsを含むDialogDismissedEventArgsを渡します。ダイアログが何らかの理由で閉じられた場合はnullされます。

標準的なIDialog.Show()メソッドは、非asyncメソッドでの一般的なUnity慣用的な使用に適しています。 async コンテキストでビジネス ロジックを記述する場合は、IDialog.ShowAsync() メソッドを使用して、より表現力豊かな構文でダイアログの結果をawaitできます。

async void SomeAsyncBusinessLogic()
{
    var result = await dialogPool.Get()
                    .SetBody("The await will resolve when the user selects the option.")
                    .SetNeutral("A button!")
                    .ShowAsync();

    Debug.Log("Async dialog says: " + result.Choice?.ButtonText);
}

ShowAsync は、 OnDismissedと同じ arg 型 ( DialogDismissedEventArgs) を返します。

シーンとプレハブの例

含まれているプレハブとサンプル シーンの詳細については、 UX コンポーネントに関するドキュメントを参照してください。