マルチユーザー研究の構築
どうやって実際に2人の参加者を接続して、一方のアクションがもう一方の画面に届くのでしょうか?
この手順では、クリックごとのメカニクスをカバーします: マルチユーザーモードの有効化、役割の割り当て、参加者の接続、そして同期を保つ方法です。マルチユーザーデザインの使用時期、ベストプラクティス、および既存の例研究については、マルチユーザー実験設計を参照してください。
以下の4つのステップは、実際にテストしている内容に関わらず、すべてのマルチユーザー研究に共通です。この4つのステップがうまく機能した後、「追加の例」セクションでは、3つの異なるデザインに再利用された同じ4つのステップを示します。
目次
前提知識
用語を理解するために、Labvancedの基本的な知識(イベントの動作や変数の使用方法など)が推奨されます。
フレーム
試行中に参加者が見るものを保持するビルディングブロックです。
イベント
トリガーとアクションとは何か、それらが研究の論理を構築するためにどのように組み合わさるか。
変数
変数とは何か、また、研究中に値をどのように保存し更新するか。
骨組みの設定
マルチ参加者モードの有効化
Labvancedの研究はデフォルトで1人の参加者用に構築されています。マルチユーザーのツール、Role_Id、Distribute Variable、同期は、研究が同時に複数の人で実行されることを示されるまで存在しません。
右の列の設定を開き、次に特別な機能の下にあるマルチユーザー研究をクリックしてTransformをクリックします。これにより、2つのフィールドが表示されます: Number of Participants(最小2)とMaximum Parallel Sessions。この設定が解除される完全なリストについては、マルチユーザー研究を参照してください。
このクリックは元に戻せません(確認ダイアログ自体にはTransform Permanentlyとラベルが付けられています)。最初に参加者数を決定し、必要なら事前に単一参加者バージョンを複製してください。

Role_Idによる役割の割り当て
マルチ参加者モードがオンの状態では、すべての参加者は依然として実験の同一で無差別なコピーを実行しています;何もそれらを区別するものはありません。Role_Idは、何も個人情報を収集することなく、各参加者に行動できるアイデンティティを与え、彼らの実験が異なることを始めることを可能にします。
Trial and Frame Trigger → On Frame Startでイベントを追加し、次にControl Actions → Requirement Actions (If... Then... Else If)アクションを追加します:
- 要件の追加: 左側 →
Variable→選択Role_Id; 比較 →equal; 右側 →Constant Value→Number→1 - その後: 役割1に適用されるアクション(例:
Set Object Propertyでターゲット画像を表示)を追加します。 - その他の場合を追加: 他のすべての役割に適用されるアクションを追加します。

Distribute Variableを使用して参加者を接続
異なるRole_Idが各参加者の前に異なるコンテンツを配置できますが、情報を彼らの間で移動できるわけではありません;各参加者の実験は依然として隔離された状態で実行されています。Distribute Variableは、1人の参加者の実験から値を押し出して別の参加者の実験に送り込む唯一のアクションであり、これこそが研究を隣同士ではなく共有感を持たせるものです。
あなたのデザインに合ったトリガーがあれば、例えばButton Click TriggerまたはEnter on Input Trigger、Variable Actions → Distribute Variable Actionを追加します:
- 値を配分する: すべての参加者、または選択された参加者
- ターゲット変数と値を選択: 受信者の画面の変数と、それに設定すべき値
- ブロック: 同じターゲット変数に同時に書き込む可能性のある参加者が1人以上いる場合は、これをオンにします

priceArrayをターゲットとし、ブロックが有効、debounceレート制限があります。参加者の同期を維持する
参加者は、自分自身で研究を同じペースで進めることはありません。同期ポイントがない場合、一方の参加者が待っている値がまだ配分されていない前に後のフレームに到達し、別の参加者の応答ではなく空白または未完成の状態を見ることがあります。
参加者が同調している必要があるフレーム(例えば、どちらも他の参加者が応答するまで進まない場合)で、フレーム設定の下のSync Frame Startを有効にします。全員がそのフレームで待機し、すべての参加者が到着するまで待ちます。

追加の例
上記の4つのステップは変わりません。変わるのは、配分されるものと同期ポイントの場所です。最もシンプルなものから始まる3つの作業バリエーション:
- 共有カウンター: 2人の参加者間で同期された状態で管理される最小バージョン
- ディレクター-マッチャー説明タスク: 一人の参加者が説明し、別の参加者がそれを特定します。
- ターンベースのオファーと応答: 一人の参加者が提案を行い、もう一人が受け入れるか拒否します。
共有カウンター
骨組みの最もシンプルなバージョン: 2人の参加者が同じランニングトータルを見て、どちらかが追加できます。
- Role_Id: ここでは不要で、両方の参加者が同じように行動するため。
- 配分:
Button Click Triggerで、すべての参加者に値を配分し、ターゲット変数SharedCount、値 =SharedCount + 1。 - 同期: 参加者を保持するトライアルの境界がないため、何も必要ありません。
これにより、マルチ参加者モードと変数配分が機能していることが確認された後に、役割ベースのロジックを追加します。
ディレクター-マッチャー説明タスク
参照コミュニケーションタスク: 一人の参加者(ディレクター)がターゲットアイテムを説明し、もう一人(マッチャー)が候補のセットからそれを特定します。
- Role_Id:
Role_Id1はターゲット画像とテキスト入力が表示されます。Role_Id2は候補画像が表示されず、ターゲットはありません。 - 配分: ディレクターのEnterキーのトリガーで、テキスト値をマッチャーの画面の
Description変数に配分し、1つの説明のみがフライト中であるべきなので、Blockを有効にします。 - 同期: 次のトライアルフレームで
Sync Frame Startを有効にし、ディレクターがマッチャーが候補を選択するまで進めないようにします。
これはイメージ説明デモの背後にある同じ構造です。
ターンベースのオファーと応答
経済的交換: 一人の参加者が共有額の分配を提案し、もう一人がそれを受け入れるか拒否します。
- Role_Id:
Role_Id1には提案された分配のための入力が表示されます。Role_Id2は提案が到着するまで何も表示されません。 - 配分: 提案者の送信トリガーで、提案された値を応答者の画面の
Offer変数に配分します。 - 同期: 結果フレームで
Sync Frame Startを有効にし、どちらの参加者も応答者が回答する前に結果が表示されないようにします。
これはウルティメイタムゲームの背後にある同じ構造です。
このパターンの実際の例として、手動で入力されたものではなく、ランダムに引かれた金額を使用すること: Role_Idが1に等しい場合、Draw Random Numberアクション(50と150の間の離散一様ドローをamountToSplitに保存)をトリガーし、その直後にDistribute VariableがamountToSplitをすべての参加者に送信し、Blockが有効になります。

amountToSplitに実行され、その後Distribute VariableがBlockが有効で全ての参加者に送信します。