はじめに
WebCamTexture には Play()
というメソッドがありますが、このメソッドは実は非同期で実行されるメソッドです。
非同期実行されるため初期化を待つ必要があるのですが、それを待つ方法を WebCamTexture にはありません。
では、どうするかというと…
WebCamTexture.width の変化をポーリングする(※WebCamTexture.height でも良い)
という方法を取ります。
この WebCamTexture.width
ですが、Play()
を呼び出す前には正確な値が入っておらず、また、Play()
を呼び出した直後も非同期実行されるためポーリングで変化を待つ必要があります。
私の環境では初期化が完了するまでは常に 16 という値が入っておりましたが Unity 公式の Answers では 100 以下の値が返される間というのがありましたので、同じように設定しました。
ソースコード
初期化完了をポーリングするソースコードは以下のようになります。
using UnityEngine;
public class WebCamTextureSample : MonoBehaviour
{
WebCamTexture _webCamTexture;
IEnumerator Start()
{
_webCamTexture = new WebCamTexture();
// WebCamTexture のプロパティは起動後でないと取得できないため、
// まず、最初にカメラを起動させる。
_webCamTexture.Play();
// WebCamTexture.width が 100 以下の状況の場合は、
// 初期化が完了していないので、100 以上になるまで待機
while (_webCamTexture.width < 100) {
yield return null;
}
// これ以降でカメラの情報が正しく取得可能
}
}
初期化が完了後に正確なカメラの解像度などが取得できます。
おわりに
対応方法は簡単なのですが、意外とネット上にある情報では WebCamTexture の初期化を待っているソースコードがなかったので、みなさんはどうしているのか?と思ったりしていたのですが、ある程度決め打ちでカメラを制御するのであれば、気にする必要はないかもしれません。