イベント消費¶
イベントは、ゲームプロセス内で扱うためのものです。はじめに特定のイベントにサブスクライブし、次に定期的に未解決のイベントをポーリングし、最後に受信したデータを適切に処理します。
In This Section
サブスクリプション¶
フィルタステップの結果を所得するには、ゲームは Genvid_Subscribe() を使用して、 id
を使って reduce ルールのアウトプットをサブスクライブします。
gs = Genvid_Subscribe(sEvent_changeColor.c_str(), &GenvidSubscriptionCallback, nullptr);
if (GENVID_FAILED(gs))
return E_FAIL;
gs = Genvid_Subscribe(sEvent_reset.c_str(), &GenvidSubscriptionCallback, nullptr);
if (GENVID_FAILED(gs))
return E_FAIL;
gs = Genvid_Subscribe(sEvent_cheer.c_str(), &GenvidSubscriptionCallback, nullptr);
if (GENVID_FAILED(gs))
return E_FAIL;
Unity では、 GenvidEventsListener プレハブ を使用する必要があります。
Unreal では、blueprint UGenvidEvents
を使用してください。
このサブスクリプションが、 id
に関連付けられた reduce の結果を、割り当てられたコールバックに送信するようにシステムに指示します。
このコールバックは、 GenvidEventSummaryCallback 形式を使用して、サブスクリプションプロセス中に割り当てられた適切な定義に従う必要があります。
Unity では、この定義は EventSummaryCallback です。
Unreal では、この定義は FOnGenvidEvent
です。
実行中¶
アプリケーションの実行中に、定期的に Genvid_CheckForEvents() を呼び出して、イベントが受信されたかどうかを確認する必要があります。
Unity では、このコールはプレバフで処理します。
Unreal では、このコールは Blueprint で処理します。
実行すると、サブスクリプションステップで割り当てられたコールバックが呼び出されます。
//--------------------------------------------------------------------------------------
// Callback invoked when Genvid Events are received.
//--------------------------------------------------------------------------------------
void GenvidSubscriptionCallback(const GenvidEventSummary * summary, void * /*userData*/)
{
std::cout << "color change received" << std::endl;
if (summary->id == sEvent_changeColor)
{
// Change the color of the cube.
const char * cubeName = summary->results[0].key.fields[0];
const char * cubeColor = summary->results[0].key.fields[1];
// Finding the cube and change the color
std::cout << "color change received " << cubeName << std::endl;
for (int i = 0; i < g_cubeTotal; ++i)
{
if (g_cubeList[i].GetName() == cubeName)
{
std::map<std::string, XMFLOAT4>::iterator colorToFind = sNameToColor.find(cubeColor);
if (colorToFind != sNameToColor.end())
{
g_cubeList[i].SetColor(colorToFind->second);
std::cout << "color changed for " << cubeName << std::endl;
}
}
}
OnUpdateColor();
}
else if (summary->id == sEvent_reset)
{
// Reset the cube position.
const char * cubeName = summary->results[0].key.fields[0];
for (int i = 0; i < g_cubeTotal; ++i)
{
if (g_cubeList[i].GetName() == cubeName)
{
g_cubeList[i].ResetPosition();
return;
}
}
}
else if (summary->id == sEvent_cheer)
{
// Handle cube cheering.
const char * cubeName = summary->results[0].key.fields[0];
for (int i = 0; i < g_cubeTotal; ++i)
{
if (g_cubeList[i].GetName() == cubeName)
{
// GENVID - Get cheer min value.
g_cubeList[i].Cheer(float(summary->results[0].values[0].value));
// GENVID - Cheer value set.
return;
}
}
}
}
コールバックは、イベントの概要を含む構造体を受け取ります。この構造体は GenvidEventSummary です。
Unity では EventSummary になります。
Unreal では、 FGenvidEventSummary
になります。
注意: イベントフィルタシステムは 無記録性 です。結果を送信後、すべてのデータを消去、リセットします。
イベント構造コンテンツ¶
この構造では、データにアクセスして視聴者のインタラクティブ性を把握しておく必要があります。このデータは階層構造レベルに含まれており、このセクションで詳細に説明しています。
最初の構造レベル¶
id: このIDは、サブスクリプションステップ中に使用したイベント ID に対応します。この情報は、チュートリアルサンプルのように、複数のイベントを同じコールバックに関連付ける場合に役立ちます。
results: results には、 GenvidEventResult の配列が含まれます。
Unity では、 EventResult の配列になります。
Unreal では、 FGenvidEventResult
の配列になります。
ここに、フィルタリングしたキーと値を取得します。
2 番目の構造レベル - > 内部結果¶
key: 構造体 GenvidEventKey です。
Unity では、構造体 EventKey になります。
Unreal では、クラス FGenvidEventKey
になります。
ここに、イベントのキーを取得します。
values: GenvidEventValue の配列です。
Unity では、 EventValue の配列になります。
Unreal では、FGenvidEventValue
の配列になります。
ここに、イベントに対応する最終値を取得します。
3 番目の構造レベル - > 内部結果 - > キー¶
fields : このイベントに関連付けられたすべてのキーを含む文字列の配列です。イベントに複数のキーを関連付けている場合、必要なフィールドをすべて取得する必要があります。
const char * cubeName = summary->results[0].key.fields[0];
const char * cubeColor = summary->results[0].key.fields[1];
3 番目の構造レベル - > 内部結果 - > 値¶
列挙型 GenvidReduceOp の順序に従う 4 つの GenvidEventValue の配列です。
reduce: GenvidReduceOp に対応する列挙子。値を必要とする reduce に応じて、必要な値を選択できます。
この例では、最小値である配列の最初の値を使用しています。
g_cubeList[i].Cheer(float(summary->results[0].values[0].value));