ワールドの壁にポスターを貼りたい。ただし、内容は月ごとに変えたい。
画像をプロジェクトに入れてしまうと、貼り替えのたびにビルドとアップロードが必要になります。Webに置いた画像を読みに行く形にすれば、ファイルを差し替えるだけで済みます。
この記事では、Web上の画像を1枚、壁のパネルに表示する ところまでを作ります。
この記事でわかること
- 画像を頼んで、あとから受け取る流れ
- ダウンローダーを持ち続ける理由
Dispose()をいつ呼ぶか- 失敗しても前の絵を残す作り
外部テキストで掲示板を更新する を試した状態から始めます。
Sponsored
絵も、頼んであとから届く
流れは文章のときと同じです。頼んで、あとから成功か失敗のどちらかが届きます。

| メソッド | 呼ばれるとき |
|---|---|
OnImageLoadSuccess(IVRCImageDownload result) | 読めた |
OnImageLoadError(IVRCImageDownload result) | 読めなかった |
違うのは、貼り先をあらかじめ渡しておける ことです。
downloader.DownloadImage(posterUrl, posterMaterial, (IUdonEventReceiver)this, textureInfo);
2つ目にマテリアルを渡しておくと、読み込みに成功した時点で そのマテリアルにもう貼られています。 成功したときに自分で貼り直す処理は要りません。
失敗したときも都合がよくなります。貼り替えが起きないので、前の絵がそのまま残ります。 掲示板で「本文は成功したときだけ差し替える」と決めたのと同じ結果が、何もしなくても手に入ります。
扱える画像には条件があります。
- PNG または JPEG の直リンク
- 2048ピクセル四方あたりが上限の目安
- URLは
VRCUrl型。実行中に文字列からは作れない
Sponsored
頼む係を持ち続ける
ここが、画像の読み込みでいちばんつまずくところです。
VRCImageDownloader は自分で new して作ります。このとき、ローカル変数にしてはいけません。
// これは動かない
private void Fetch()
{
VRCImageDownloader downloader = new VRCImageDownloader();
downloader.DownloadImage(posterUrl, posterMaterial, (IUdonEventReceiver)this, textureInfo);
}
メソッドを抜けた時点で、この変数はどこからも参照されなくなります。すると、まだ届いていない画像ごと片付けられます。

頼んだ本人がその場を離れると、届いた荷物を受け取る人がいなくなる。そう考えると覚えやすいと思います。
正しくはフィールドで持ちます。
private VRCImageDownloader downloader; // ずっと持っておく
private void Start()
{
downloader = new VRCImageDownloader();
}