Metaverse Art Gallery
概要
Art Galery スペースはAPIを使用してアートワークをダイナミックに表示する方法を示した事例です。
プレイヤーは検索フィールドに任意のキーワードを入力してアートワークを検索し、ミュージアムのパブリックデータで表示することができます。
これを実現するために、 Art Institute of Chicago APIを使用してミュージアムのパブリックデータを検索し表示できるようにしています。
Art Institute of Chicago APIを適用しているのにはいくつか理由があります。
- APIのドキュメントが豊富
- アートワークのクオリティが高い
- CC0コンテンツフィルタリングが可能
ArticDisplay
Artworks placeholders have been dispatched on the walls of the gallery at predefined positions.
絵画に加えて、関連情報(タイトル、作家、詳細)も表示しています。
作品を実際のサイズまたは大きいサイズで表示するためのボタンもあります。
アートワークプレイスホルダーはそれぞれArticDisplay
クラスが管理しており、アートワークの全てのパラメータはArticArtwork
というネットワーク構造体に登録されています。
C#
public struct ArticArtwork : INetworkStruct
{
public NetworkBool isVisible;
public int id;
public NetworkString<_64> image_id;
public NetworkString<_128> title;
public NetworkString<_128> artist_display;
public Vector2 dimension;
...
}
アートワークプロパティが変更されたらすぐに、OnArticArtworkChanged()
メソッドが呼び出されて表示を更新します。
C#
[Networked(OnChanged = nameof(OnArticArtworkChanged))]
public ArticArtwork articArtwork { get; set; }
static void OnArticArtworkChanged(Changed<ArticDisplay> changed)
{
changed.Behaviour.OnArticArtworkChanged();
}
private void OnArticArtworkChanged()
{
if (articArtwork.isVisible)
DisplayArtWork();
else
HideArtWork();
}
SearchManager
ギャラリーの入口に検索パネルが設置されています。
使用しやすくするために、事前定義検索のためのボタンがいくつか追加されています。
プレイヤーが事前定義されたボタンに触れると、SearchManager LaunchPredefinedSearch()
メソッドが、パラメータでの事前定義済みの単語とともに呼び出されます。
ユーザーがキーボードを使用してキーワードを入力し検索ボタンを使用すると、LaunchSearch()
メソッドが呼び出されます。
検索キーワードはネットワーク上で同期される点にご留意ください。UIに便利ですし、二人のユーザーが同じ検索を行った際にリソース消費(帯域幅やAPIの消費)を防ぐためにも有用です。
C#
[Networked(OnChanged = nameof(OnKeywordChanged))]
public NetworkString<_128> keyword { get; set; }
static void OnKeywordChanged(Changed<SearchManager> changed)
{
changed.Behaviour.OnKeywordChanged();
}
private void OnKeywordChanged()
{
keywordInputField.Text= keyword.ToString();
}
検索が開始されると(非同期のDoLaunchSearch()
タスク)、最初にStateAuthority
をリクエストし、リモートのプレイヤーと検索キーワードを同期します。
それから、ArticGalleryManager
にパラメータ内で受け渡された文字列を検索するように求めます。
こうすることで、全プレイヤーが検索されたキーワードを表示していても、検索は一人のプレイヤーのみが行うことになります。
C#
public async Task DoLaunchSearch()
{
await PrepareSearch();
articGalleryManager.LaunchSearch(keyword.ToString());
}
public async Task PrepareSearch()
{
if (Object.StateAuthority != Runner.LocalPlayer)
{
if (!await Object.WaitForStateAuthority()) return;
}
// sync the keyword
keyword = keywordInputField.Text.Trim();
...
}
ArticGalleryManager
ArticGalleryManager
は、キーワードを使用して Art Institute of Chicago ライブラリでの項目の検索を行い、アートワークプレースホルダーに結果を表示します。
これを行うために、シーン内のすべてのArticDisplay
のリストはAwake()
中に初期化されます。
LaunchSearch
タスクの最中に、ArticSearchRequest
メソッドが使用され適切なアートワークを探します。
結果はartworkDescriptions
リストに登録され、FillDisplayFound()
関数とFillDisplayAsync()
関数の働きによって表示されるようになります。
FindMostFittingDisplay()
は適切なアートワークプレイスホルダーの検索を担当します(他より大きなアートワークを置ける壁もあります)。FillDisplayAsync()
は、APIから受信したデータでアートワークプロパティを更新し、アートワークプレイスホルダーのStateAuthority
をリクエストしてネットワーク上で同期します。
C#
async Task FillDisplayAsync(ArticData data, ArticDisplay display, string iiif_url)
{
ArticArtwork articArtWorkTemp = new ArticArtwork();
articArtWorkTemp.isVisible = true;
articArtWorkTemp.title = data.title;
articArtWorkTemp.artist_display = data.artist_display;
articArtWorkTemp.id = data.id;
articArtWorkTemp.image_id = data.image_id;
articArtWorkTemp.dimension = data.ParsedDimensions;
// GET authority on the ArticDisplay
if (display.Object.StateAuthority != display.Runner.LocalPlayer)
{
if (!await display.Object.WaitForStateAuthority()) return;
}
...
// sync the artwork
display.articArtwork = articArtWorkTemp;
...
}
ArticAPIManager
ArticAPIManager
クラスは Art Institute of Chicago APIを管理しています。Fusion SDKには依存しません。
APIのドキュメントはこちらからご覧いただけます。