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

| メソッド | 呼ばれるとき |
|---|---|
OnImageLoadSuccess(IVRCImageDownload result) | 読めた |
OnImageLoadError(IVRCImageDownload result) | 読めなかった |
違うのは、貼り先をあらかじめ渡しておける ことです。
downloader.DownloadImage(posterUrl, posterMaterial, (IUdonEventReceiver)this, textureInfo);
2つ目にマテリアルを渡しておくと、読み込みに成功した時点で そのマテリアルにもう貼られています。 成功したときに自分で貼り直す処理は要りません。
失敗したときも都合がよくなります。貼り替えが起きないので、前の絵がそのまま残ります。 掲示板で「本文は成功したときだけ差し替える」と決めたのと同じ結果が、何もしなくても手に入ります。
扱える画像には条件があります。
- PNG または JPEG の直リンク
- 2048ピクセル四方あたりが上限の目安
- URLは
VRCUrl型。実行中に文字列からは作れない
頼む係を持ち続ける
ここが、画像の読み込みでいちばんつまずくところです。
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();
}
そして、ワールドを離れるときに片付けます。
private void OnDestroy()
{
if (downloader != null) downloader.Dispose();
}
Dispose() は「もう使 いません」という宣言です。表示中に呼んではいけません。 呼んだ瞬間、そのダウンローダーが持っている画像も一緒に消えます。呼ぶのは片付けのときだけです。

実践:ポスターパネルを作る
壁のパネルにWebの画像を表示して、更新ボタンで読み直せるようにします。
1. パネルを用意する
Projectウィンドウで右クリックし、「Create → Material」で PosterMaterial を作ります。Shaderを Unlit/Texture にします。
シーンに次を置きます。
| 名前 | 作り方と設定 |
|---|---|
PosterPanel | 3D Object → Quad。(0, 2, 4)、Scale (1.4, 2, 1)。マテリアルに PosterMaterial |
StatusCanvas | UI Canvas(World Space)。(0, 0.7, 3.95)、Scale (0.003, 0.003, 0.003) |
StatusText | StatusCanvas の子に TextMeshPro。小さめの文字 |
UpdateButton | Cube。(1, 1, 3)、Scale (0.4, 0.4, 0.4) |
