Metaverse Art Gallery
概述
藝廊 空間是一個示例,其說明如何使用一個API來動態地展示藝術品。
玩家可以使用搜尋欄位並且輸入任何關鍵字來尋找藝術品,並且在藝廊牆上展示它們。
為了做到這點,我們使用 芝加哥藝術博物館 API 以探索及展示博物館的公共資料。
芝加哥藝術博物館 API已經基於幾個理由而被選擇:
- 該API被完整建檔
- 藝術品品質非常好
- 可用CC0內容篩選
Artic展示
已經在藝廊的牆上在預先定義的位置上安放藝術品預留位置。
除了畫作之外,我們也展示關於它的資訊(標題、作者、說明)。
也有一個按鈕,以顯示作品的真實尺寸或一個更大的尺寸。
各個藝術品預留位置由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();
}
搜尋管理器
在藝廊的入口處放置一個搜尋面板。
為了讓其更容易使用,已經新增一些預先定義的搜尋的按鈕。
當玩家觸碰這個預先定義的按鈕時,以參數中預先定義的字詞來調用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文檔在這裡可用