強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Unity 3.5の新機能、 WebCamTexture を使ってみた


Unity 3.5(現在、パブリックベータ)からWebカメラで撮影している動画をリアルタイムにテクスチャとして使用可能な WebCamTexture というクラスが追加されました。

使い方は例えば Cube などにJavaScriptファイルを追加し、以下の様な内容を記述すればOK。

function Start () {
	var devices : WebCamDevice[] = WebCamTexture.devices;
	if (devices.length > 0) {
		var webcamTexture : WebCamTexture = WebCamTexture(320, 240, 12);
		renderer.material.mainTexture = webcamTexture;
		webcamTexture.Play();
	} else {
		Debug.LogError("Webカメラが検出できませんでした。");
	}
}

自分が試した環境(VAIOのノートPC)ではWebカメラが起動すると連動して以下の様なアプリが毎回起動します。

そのため「ウィンドウのフォーカスがUnityからこのアプリに移動する」→「Unityがフォーカスが外れたのを検知して描画を停止」という流れが発生し、Webカメラで撮影されたデータが反映されなくて少しの時間、???となりハマリました。その様な環境の人はそれらのアプリの動作を停止させるか、起動した後にUnityのウィンドウをクリックしてフォーカスを戻す必要がありますので注意して下さい。

複数のオブジェクトに使いたい場合にはこのスクリプトをそれぞれのオブジェクトに使用するという方法ではダメな様で、最後に指定したものにしか反映されませんでした。

空のGameObjectに以下の様なスクリプトを記述して設定しすると複数のオブジェクトに対しても適用可能でした。

function Start () {
	var devices : WebCamDevice[] = WebCamTexture.devices;
	if (devices.length > 0) {
		var webcamTexture : WebCamTexture = WebCamTexture(320, 240, 12);
		var cube : GameObject = gameObject.Find("Cube");
		var plane : GameObject = gameObject.Find("Plane");
		cube.renderer.material.mainTexture = webcamTexture;
		plane.renderer.material.mainTexture = webcamTexture;
		webcamTexture.Play();
	} else {
		Debug.LogError("Webカメラが検出できませんでした。");
	}
}

なお、スタンドアローンアプリでは問題無く動作しましたがWeb Playerとして出力した場合は以下の様な表示になりました。おそらく、今のところ未対応なのだと思われます。

関連情報

Script Referenceの Application.RequestUserAuthorization にかなり重要な情報が有ります。一度、目を通しておいた方が良いでしょう。