This document is about: FUSION 2
SWITCH TO

메타버스 아트 갤러리


Available in the Industries Circle
Circle

개요

아트 갤러리 스페이스는 API를 사용하여 작품을 동적으로 전시하는 방법에 대한 예시입니다.
플레이어는 검색 필드를 사용하여 임의의 키워드를 입력하여 예술 작품을 찾고 갤러리 벽에 표시할 수 있습니다.
이를 위해 Art Institute of Chicago API를 사용하여 박물관의 공공 데이터를 탐색하고 전시합니다.

Art Institute of Chicago API가 선택된 이유는 다음과 같습니다:

  • API가 잘 되어 있습니다 문서
  • 예술작품의 퀄리티가 좋습니다
  • CC0 콘텐츠 필터링 가능
Fusion 메타버스 아트 갤러리

ArticDisplay

갤러리 벽에 미리 정의된 위치에 예술품 플레이스 홀더가 있습니다.
그림 외에도 그림에 대한 정보(제목, 작가, 설명)도 표시합니다.
작품의 실제 크기나 더 큰 크기를 표시하는 버튼도 있습니다.

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();
}

SearchManager

갤러리 입구에는 검색 패널이 설치되어 있습니다.
사용하기 쉽도록 미리 정의된 검색을 위한 일부 버튼이 추가되었습니다.

Fusion 메타버스 아트 갤러리

플레이어가 이 미리 정의된 버튼 중 하나를 터치하면 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();
...
}

ArticGalleryManager

ArticGalleryManager는 키워드를 이용하여 Art Institute of Chicago 라이브러리로 작품을 검색하고 그 결과를 아트 플레이스 홀더에 표시하는 역할을 합니다.
이를 위해 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;
...
}

ArticAPIManager

ArticAPIManager 클래스는 Art Institute of Chicago API를 관리합니다.
Fusion SDK에는 의존성이 없습니다.
API 설명서는 여기에서 확인할 수 있습니다.

Back to top