This document is about: FUSION 1
SWITCH TO

Metaverse Art Gallery

Available in the Industries Circle

概要

Art Galery スペースはAPIを使用してアートワークをダイナミックに表示する方法を示した事例です。
プレイヤーは検索フィールドに任意のキーワードを入力してアートワークを検索し、ミュージアムのパブリックデータで表示することができます。
これを実現するために、 Art Institute of Chicago APIを使用してミュージアムのパブリックデータを検索し表示できるようにしています。

Art Institute of Chicago APIを適用しているのにはいくつか理由があります。

  • APIのドキュメントが豊富
  • アートワークのクオリティが高い
  • CC0コンテンツフィルタリングが可能
Fusion Metaverse Art Gallery
Fusion Metaverse Art Gallery

ArticDisplay

Artworks placeholders have been dispatched on the walls of the gallery at predefined positions.
絵画に加えて、関連情報(タイトル、作家、詳細)も表示しています。
作品を実際のサイズまたは大きいサイズで表示するためのボタンもあります。

Fusion Metaverse Art Gallery
Fusion Metaverse Art Gallery

アートワークプレイスホルダーはそれぞれ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

ギャラリーの入口に検索パネルが設置されています。
使用しやすくするために、事前定義検索のためのボタンがいくつか追加されています。

Fusion Metaverse Art Gallery
Fusion Metaverse Art Gallery

プレイヤーが事前定義されたボタンに触れると、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のドキュメントはこちらからご覧いただけます。

Back to top