Unityでバーコード・QRコードリーダーをつくる
Unityを使って、バーコードやQRコードをカメラで読み取るアプリを作ろうと思い立ち、やってみました。
Unityバージョンは2018.1.6f1。
こちらの記事を参考に進めたら骨子は難なくできました。
Zxingというのが、バーコードリーダーライブラリのデファクトのようで、あらゆる言語・プラットフォームに対応したバージョンを提供しています。
GitHub - zxing/zxing: ZXing ("Zebra Crossing") barcode scanning library for Java, Android
UnityはC#なので派生プロジェクトのZxing.Netを使うんですね。
Clientsの中にUnity向けのサンプルコードがありまして、こちらも参考になりました。
参考にした記事・コードを踏まえて自分で作ってみたときのポイントは、
- StartにてwebcamTextureの初期化とPlay()をするが、これらの処理が完了する前にUpdateが呼ばれることがあるため、Updateの頭でチェックをしてあげる必要があった。
void Update() { if (webcamTexture == null || !webcamTexture.isPlaying) { return; } ・・・
- ZxingのBarcodeReaderクラスのDecodeでバーコード認識処理ができるが、重い処理なのでUpdate内で単純に呼ぶとフレームレートが落ちてカクカクになってしまう。 そのため、ZxingのサンプルのDecodeQRメソッドのように、Decodeの処理は別スレッドで回し、結果だけ受け取るようにするとよい。
- Zxingでは、QRコードでも普通の1次元バーコードでもBarcodeReaderクラスのDecodeメソッドで読み取れる(自動的に判別してくれる)が、1次元バーコードの場合、カメラに対して水平方向に映す必要がある。
- Android向けにビルドする場合、WebCamTextureはLandscapeの向きでキャプチャされるため、Portraitで使いたい場合はテクスチャを貼っているオブジェクトを90度回転させてつじつまを合わせる、という方法がよく出てくる。
しかし1次元バーコードを読み取りたい場合、90度回転させると見た目に対してバーコードを縦向きに映す必要があり、直感的でなくなる。
そのため、LandscapeでUIを作るか、Landscapeで指定した上でPortrait向きに使って違和感のないUIにするか、といった工夫が必要になる。
そのほか、バーコードリーダー部分とは関係ないけど、Unityでカメラを使う方法を学べた。
- WebCamTextureを使う
- UI.PanelなりCubeなりにWebCamTextureのインスタンス指定することで表示する
- 表示処理(Updateメソッド)と画像処理は別スレッドにするのがよい
ぐっちゃぐちゃだけど試した時のコードはこちら(github)。