Unityでカメラ(PC/スマホ)を使う方法

Unity上で「カメラを使って~をしたい!」「写真を撮りたい!」という方、多いのではないでしょうか?そこで今回はUnityでカメラを使う方法について書きたいと思います。

Unityのカメラはスマートフォン、パソコンそれぞれに対応しています。

カメラにアクセスするには?

まず「WebCamTexture」といったクラスを使います。

このクラスを使うと、カメラ(Webカメラ・スマートフォンのカメラ)で映し出された映像をテクスチャとして扱うことができまるようになります。

※なお、スマートフォンの場合フロント・リアカメラどちらにでもアクセスすることが可能です。

とりあえず映してみる

まずは「どうやってプログラムを書けばカメラの映像を出せるかだけが知りたいんだよ」という方も多いと思うのでとりあえずサクッとカメラの映像を表示させてみようと思います。


もし、PCにカメラがついていない環境で開発する人(デスクトップPCなど)は

このような安いものでも探してみるといいかもしれません~👼


1.まずプロジェクトを作成し、カメラの映像を表示させるための「RawImage」を設置します。

※「Create」→「UI」→「Raw Image」から作成可能です。

2.スクリプトを作成します。

ファイル名:WebCameraTest.cs

using UnityEngine;
using UnityEngine.UI;

public class WebCameraTest : MonoBehaviour {

    public RawImage rawImage;

    WebCamTexture webCamTexture;

    void Start () {
        webCamTexture = new WebCamTexture();
        rawImage.texture = webCamTexture;
        webCamTexture.Play();
	}
	
	void Update (){
	}
}

3.スクリプトをシーン上のオブジェクト(今回はEventSystemにしているが何でも良い)にドラック&ドロップでアタッチし、その後EventSystemをダブルクリックし開き、右のインスペクターからスクリプト内RawImageにもアタッチする

4.実行してみる。PCの場合はカメラを接続してから実行してください。

しかし!環境によって次の問題が発生する場合があります。

・スマホで実行したとき、求めているカメラの方向ではない(リア・フロント)
・PCでやったがそもそも映らない
・移された画像の向きが反対

これらには理由がありますので次項で解説していきたいと思います。

WebCamTextureをいじってみる

使用するカメラを選択・変更する

アプリの実行環境によってはカメラがいくつか複数個、接続されている可能性があります。この場合、表示させるカメラを選ばなくてはいけません。

もし前項で実行したが表示されなかったという人は、表示できないカメラにアクセスしていたのかもしれないのでここで正しい表示させたいカメラを選ぶことが大切です。

カメラを選択する

先ほどのソースコードに追加し、ボタンをクリックするとカメラを変更できるようにしたいとおもいます。

public class WebCameraTest : MonoBehaviour {

    public RawImage rawImage;

    WebCamTexture webCamTexture;
    WebCamDevice[] webCamDevice; /* 追加1 */
    int selectCamera = 0; /* 追加 2*/

    void Start () {
        webCamTexture = new WebCamTexture();
        webCamDevice = WebCamTexture.devices; /* 追加3 */
        rawImage.texture = webCamTexture;
        webCamTexture.Play();
	}

    public void ChangeCamera() /* 追加4 */
    {
        int cameras = webCamDevice.Length; //カメラの個数
        if ( cameras < 1) return; // カメラが1台しかなかったら実行せず終了

        selectCamera++;
        if (selectCamera >= cameras) selectCamera = 0;

        webCamTexture.Stop(); // カメラを停止
        webCamTexture = new WebCamTexture(webCamDevice[selectCamera].name); //カメラを変更
        rawImage.texture = webCamTexture; 
        webCamTexture.Play(); // 別カメラを開始
    }
}

スクリプトを上のように変更し、シーン上に変更用ボタンを生成します。その後、ボタンのOnClickにpublic void ChangeCamera()を割り当てれば完了です。

ボタンを押せばカメラが切り替わると思います。(複数個接続時)

※また、スマホのリア・フロントカメラは別々のカメラとして扱われます。

取得する画質・フレームレートを変更する

WebCamTextureのインスタンス生成時に引数として画質やフレームレートを指定すると変更することができます。

カメラによっては対応していない場合もあります。
(例:HDカメラでFull HDをリクエスト等)

webCamTexture = new WebCamTexture(); //元のコード

webCamTexture = new WebCamTexture(int x,int y); // width,height サイズを指定
webCamTexture = new WebCamTexture(int x,int y,int fps); //フレームレートも指定
webCamTexture = new WebCamTexture(string name,int x,int y,int fps); // カメラも指定する

カメラをミラー表示にする

この映像を、

こうする。

やり方はRawImageのスケール(Scale)のXを-1にするだけです。

上下反転したい場合はYを-1にすればOKです。

3Dオブジェクトに表示する

このように3Dのオブジェクトにカメラの映像を張り付けることもできます。

public GameObject cube;
cube.GetComponent<MeshRenderer>().material.mainTexture = webCamTexture;

GameObjectのテクスチャをWebCamTextureに変える事で実装可能です。

まとめ

ここではUnityでカメラを使う方法について説明しました。カメラを使えば写真を撮る以外にも様々な使い方ができるようになるのではないでしょうか?

Unityでカメラを使った例:
Webカメラを使って顔認識 モーションキャプチャーへの道(Part 1)

これからもカメラを用いた様々な使い道を見つけていきたいですね!

読んでくれて本当にありがとうございました^^

もしよろしければ他の記事も観ていってくださるとうれしい限りです!