VRChat 非公式日本語ドキュメント

画像読み込みの例

Udonを使用すると、インターネットから画像を読み込み、UI要素やワールド内のオブジェクトのテクスチャとして表示することができます。以下のサンプルワールドでは、このシステムの仕組みと、GitHubを使用して画像やキャプションをホストする方法を解説しています。

サンプルワールド

サンプルプロジェクトをダウンロードするか、GitHubリポジトリにアクセスしてクローンしてください。

このシーンには、対応するキャプションと共に表示する画像を自動的に切り替えるフォトフレームが設置されています。画像とキャプションはどちらもGitHub Pagesで無料でホストされており、上記のGitHubリポジトリに含まれています。

シーンファイル: Assets/_Project/Gallery

プレハブをワールドで使用する

プレハブを使用するには、プロジェクトに追加し、画像キャプションのURLを設定する必要があります。

このリポジトリは、無料ホスティングのために GitHub Pages へ公開します。画像やキャプションはどこにホストしても構いませんが、GitHub Pagesは無料で設定が簡単であり、ワールドと同じリポジトリ内に画像やキャプションを保持できるため、利用を推奨します。別の場所にホストする場合は、ステップ4に進んでください。

  1. サンプルリポジトリをフォークして、自身のGitHubアカウントに作成します。

  2. "Web"ディレクトリ内の画像とキャプションを編集します。index.htmlページはブラウザ上で画像とキャプションをテストするためのサンプルに過ぎないため、無視または削除して構いません。プレハブを利用しやすくするために画像名を 1.jpg などにしておくか、名前を変更してプレハブのURLを更新してください。

ヒント

「Web」ディレクトリ内のファイルが編集されると、ウェブサイトが再公開されます。ファイル名が同じであれば(画像が 1.jpg、2.jpg など)、ワールド内のURLは新しく公開されたファイルを参照します。再公開は含まれているGitHub Actionを通じて自動的に行われます。

  1. リポジトリをコンピュータにクローンします。

  2. プロジェクトにSDK 3.2.3以降、およびClientSimとUdonSharpが含まれていることを確認してください。これらはCreator Companionから簡単に追加できます。

  3. Prefab Unitypackageをプロジェクトにインポートします。

  4. SlideshowFrameプレハブをシーンにドラッグします。

  5. シーンのInspectorでSlideshowFrameを選択します。

  6. SlideshowFrameコンポーネントで、Image Urls配列のサイズを読み込みたい画像の数に合わせ、各URLを自身の画像URLに更新します。GitHub Pagesを使用する場合、URLの形式は https://<your-github-username>.github.io/<your-repo-name>/1.jpg となります。

  7. String Urlを自身のキャプション用URLに更新します。GitHub Pagesを使用する場合、URLの形式は https://<your-github-username>.github.io/<your-repo-name>/captions.csv となります。

動作テスト

GitHubを使用して画像やキャプションをホストしている場合は、変更をGitHubにコミットおよびプッシュしたことを確認してください。これによりGitHub Actionがトリガーされ、ファイルがGitHub Pagesに公開されます。

  1. UnityでPlay Modeに入ります。
  2. 画像とキャプションは自動的に読み込まれるはずです。読み込まれない場合は、Consoleにエラーが出ていないか確認してください。
  3. Build and Testを実行し、VRChatでも動作することを確認します。設定で「Untrusted URLs」をオンにする必要があるかもしれません。

重要なGameObject

シーン内で確認すべき最も重要なオブジェクトは、TheFrameSlideshowFrameです。

画像

TheFrame

TheFrameは、いくつかの重要な要素を持つGameObjectです。

  • SlideshowFrame: ウェブサーバーから画像とキャプションを読み込むUdonBehaviourです。
  • Mesh: 写真の周囲にある黒い枠です。
  • Picture: ダウンロードしたテクスチャを描画するMeshです。
  • UI: キャプションを描画するワールドスペースのCanvasです。

SlideshowFrame

SlideshowFrame UdonBehaviour には、Webサーバーから画像やキャプションをダウンロードするためのすべてのロジックが含まれています。

画像

以下のパブリック変数が用意されています:

  • Image Urls: ダウンロードする画像の VRCUrls を格納する Array です。
  • String Url: キャプションテキストをダウンロードするための単一の VRCUrl です。
  • Renderer: このターゲット RenderersharedMaterial に、ダウンロードしたテクスチャが設定されます。
  • Field: この UI Elementtext プロパティに、対応するテクスチャのダウンロード済みキャプションが設定されます。
  • Slide Duration Seconds: 各画像を表示する時間です。

スクリプトの基本的なロジックフローは以下の通りです:

Image Downloaderを作成する

Using the ImageDownload ImageDownload スクリプトを使用して画像をダウンロードする

SDKには、画像を簡単にダウンロードするためのスクリプトが含まれています:

  1. シーンに新しいGameObjectを作成します。
  2. UdonBehaviourコンポーネントを追加します。
  3. ImageDownloadをプログラムソースとして選択します。
  4. ダウンロードしたテクスチャを適用するMaterialを選択します。
  5. (任意)TextureInfoをカスタマイズして、ダウンロードするテクスチャの設定を変更します。

独自のスクリプトを作成して VRCImageDownloader

独自のUdon GraphスクリプトでVRCImageDownloaderを使用できます。

  1. Constructorノードを使用して、新しいVRCImageDownloaderオブジェクトを作成します。
  2. 新しく作成したVRCImageDownloaderを変数として保存します。(これは required です。)
  3. VRCImageDownloaderインスタンス上でDownloadImage関数を実行します。
  4. (任意)OnImageLoadSuccessまたはOnImageLoadErrorイベントの実行を待機します。

スクリプトの基本的なロジックフローは以下の通りです。

  1. On StartでVRCImageDownloaderを構築し、すべての画像のダウンロードに再利用します。テクスチャを保持するために、このインスタンスを維持しておくことが重要です。
// It's important to store the VRCImageDownloader as a variable, to stop it from being garbage collected!
_imageDownloader = new VRCImageDownloader();
  1. String Urlからキャプション/文字列をダウンロードします。

文字列のダウンロードに成功したら、行ごとに分割して個別の文字列にし、それらを_captions配列に保存します。ダウンロードに失敗した場合は、エラーメッセージをログに出力します。

Udon Graphでの画像読み込みの使用例。Udon Graphでは改行文字を直接使用できないため、代わりに整数から文字への変換が使用されています。

  1. 次の画像を読み込みます。_loadedIndexをインクリメントして現在位置を追跡し、先ほど保存したダウンローダーでDownloadImage()を呼び出します。

画像のダウンロードに成功した場合はその参照を保存し、Rendererに読み込ませます。失敗した場合はエラーメッセージをログに出力します。

  1. SlideDurationSecondsだけ遅延させて、再度次の画像を読み込む関数を呼び出します。_loadedIndexは読み込み呼び出しのたびにインクリメントされ、配列内の最後のURLに到達すると最初に戻ります。

各画像が2回目以降に表示される際は、初回ダウンロードに失敗した場合を除き、新たに読み込まれるのではなく保存済みのTexture2D参照から表示されます。

ソースコード

SlideshowFrame.cs の完全なソースコードは GitHub で確認してください。

既知の問題

  • 最初の画像のキャプションの読み込みが間に合わず、最初のループが一周するまで表示されません。
Udon

ドメインやファイル制限など、Image Loading システムの詳細については、Image Loading のメインドキュメントページを参照してください。

最終更新: