イベント消費
イベントは、ゲームプロセス内で扱うためのものです。はじめに特定のイベントにサブスクライブし、次に定期的に未解決のイベントをポーリングし、最後に受信したデータを適切に処理します。
このセクションの内容
サブスクリプション
フィルタリングの結果を受け取るために、ゲームでは Genvid_Subscribe()
を使って、ルールの id
値を使用して reduce rule の出力をサブスクライブします。
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: これは:cpp:struct:`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 番目の構造レベル - > 内部結果 - > 値
これは 4 つの GenvidEventValue
からなる配列で、 enum GenvidReduceOp
の順序に従います。
reduce: GenvidReduceOp
に対応する Enumerator です。値が欲しいreduceに応じて、必要な値を選択することができます。
この例では、最小値である配列の最初の値を使用しています。
g_cubeList[i].Cheer(float(summary->results[0].values[0].value));