外部カメラの映像を以下のようにしてImageに貼り付けることができる。
1 2 3 4 |
public Image img; ... img.material.mainTexture = webcamTexture; ... |
ただこれだと、カメラ切り替えなどを行うと映像が停止してしまう。
基本的なカメラの扱い方はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public Image img; WebCamTexture webcamTexture; int camnum; void CameraStart(){ if (WebCamTexture.devices.Length > 0) { if(webcamTexture){ webcamTexture.Stop(); } webcamTexture = new WebCamTexture (WebCamTexture.devices[camnum].name); webcamTexture.Play(); img.material.mainTexture = webcamTexture; } else { Debug.Log("カメラなし"); return; } } |
CameraStartを最初に呼んだときはうまくいくが、2度目に呼び出された瞬間に映像が停止する(最後の映像で固まる)。
Unityのバージョンは2017.1.1なので webcamTexture.Stop() の不具合ではない。
また mainTexture に貼り付けるタイミング次第では全く動かないこともあったので、以下のようにフレームのタイミングを合わせたりしたけどダメだった。
1 2 3 4 5 6 7 |
... StartCoroutine(CameraRender()); ... IEnumerator CameraRender(){ yield return new WaitForEndOfFrame(); img.material.mainTexture = webcamTexture; } |
以前にRendererのmaterial.mainTextureを書き換えた際には問題なかったので、Quadにでも変更しようかと思ったけど2Dのプロジェクトなので使いたくない。
色々試しつつ、ダメ元でRawImageを使ってみたらうまくいった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public RawImage rimg; WebCamTexture webcamTexture; int camnum; void CameraStart(){ if (WebCamTexture.devices.Length > 0) { if(webcamTexture){ webcamTexture.Stop(); } webcamTexture = new WebCamTexture (WebCamTexture.devices[camnum].name); webcamTexture.Play(); rimg.texture = webcamTexture; } else { Debug.Log("カメラなし"); return; } } |
詳しい理由は不明。
そもそも Sprite ありきの Image オブジェクトでテクスチャ張替えするのがよくないのかもしれない。