메타버스 아트 갤러리
개요
아트 갤러리 스페이스는 API를 사용하여 작품을 동적으로 전시하는 방법에 대한 예시입니다.
플레이어는 검색 필드를 사용하여 임의의 키워드를 입력하여 예술 작품을 찾고 갤러리 벽에 표시할 수 있습니다.
이를 위해 Art Institute of Chicago API를 사용하여 박물관의 공공 데이터를 탐색하고 전시합니다.
Art Institute of Chicago API가 선택된 이유는 다음과 같습니다:
- API가 잘 되어 있습니다 문서
- 예술작품의 퀄리티가 좋습니다
- CC0 콘텐츠 필터링 가능
ArticDisplay
갤러리 벽에 미리 정의된 위치에 예술품 플레이스 홀더가 있습니다.
그림 외에도 그림에 대한 정보(제목, 작가, 설명)도 표시합니다.
작품의 실제 크기나 더 큰 크기를 표시하는 버튼도 있습니다.
각 예술품 플레이스 홀더는 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
갤러리 입구에는 검색 패널이 설치되어 있습니다.
사용하기 쉽도록 미리 정의된 검색을 위한 일부 버튼이 추가되었습니다.
플레이어가 이 미리 정의된 버튼 중 하나를 터치하면 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 설명서는 여기에서 확인할 수 있습니다.