This document is about: FUSION 2
SWITCH TO

Metaverse Art Gallery


Available in the Industries Circle
Circle

概述

藝廊 空間是一個示例,其說明如何使用一個API來動態地展示藝術品。 玩家可以使用搜尋欄位並且輸入任何關鍵字來尋找藝術品,並且在藝廊牆上展示它們。 為了做到這點,我們使用 芝加哥藝術博物館 API 以探索及展示博物館的公共資料。

芝加哥藝術博物館 API已經基於幾個理由而被選擇:

  • 該API被完整建檔
  • 藝術品品質非常好
  • 可用CC0內容篩選
fusion metaverse art gallery

Artic展示

已經在藝廊的牆上在預先定義的位置上安放藝術品預留位置。 除了畫作之外,我們也展示關於它的資訊(標題、作者、說明)。 也有一個按鈕,以顯示作品的真實尺寸或一個更大的尺寸。

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;
...
}

利用Render()中勾選的ChangeDetector,當更改藝術品屬性後,調用OnArticArtworkChanged()方法以更新展示。

C#

[Networked]
public ArticArtwork articArtwork { get; set; }

ChangeDetector changeDetector;

public override void Render()
{
    base.Render();
    foreach (var changedVar in changeDetector.DetectChanges(this))
    {
        ...
        if (changedVar == nameof(articArtwork))
        {
            OnArticArtworkChanged();
        }
    }
}

private void OnArticArtworkChanged()
{
    if (articArtwork.isVisible)
        DisplayArtWork();
    else
        HideArtWork();
}

搜尋管理器

在藝廊的入口處放置一個搜尋面板。 為了讓其更容易使用,已經新增一些預先定義的搜尋的按鈕。

fusion metaverse art gallery

當玩家觸碰這個預先定義的按鈕時,以參數中預先定義的字詞來調用SearchManager LaunchPredefinedSearch()方法。 如果使用者以鍵盤輸入任何關鍵字,並且使用搜尋按鈕,那麼它調用LaunchSearch()方法。

請注意,搜尋關鍵字在網路上被同步:這對於UI而言是有用的,但在兩名使用者執行相同的搜尋時也迴避了資源耗用(頻寬及API)。

C#

[Networked]
public NetworkString<_128> keyword { get; set; }

ChangeDetector changeDetector;

public override void Render()
{
    base.Render();
    foreach (var changedVar in changeDetector.DetectChanges(this))
    {
        if (changedVar == nameof(keyword))
        {
            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();
...
}

Artic藝廊管理器

ArticGalleryManager負責使用一個關鍵字在 芝加哥藝術博物館 庫中搜尋物件,並且在藝術品預留位置上顯示結果。 為了做到這點,在Awake()期間將初始化在場景中的所有ArticDisplay的一個清單。

LaunchSearch任務期間,它使用ArticSearchRequest方法來找到適當的藝術品。 利用FillDisplayFound()FillDisplayAsync()函數,將結果記錄到artworkDescriptions清單之中及展示:

  • 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;
...
}

ArticAPI管理器

ArticAPIManager類別管理 芝加哥藝術博物館 API。 不仰賴Fusion SDK。 API文檔在這裡可用

Back to top