渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

UnityでiOS・Android実機で動くQRリーダーを作る


f:id:esakun:20150730215258g:plain

まずは今回使用するZxingというライブラリを手に入れます。ちなみにライセンスApache License 2.0 (Apache)とのことなので、比較的自由に使えます。

zxingnet.codeplex.com

f:id:esakun:20170619192457p:plain

解凍すると様々な環境におけるプラグインファイルが現れます。

ちなみにSystem.DrawingがUnityに存在しないので、net2.0, net3.5のプラグインでは動きません。以下のようなエラーが出てコンパイルできません。

error CS0234: The type or namespace name `Drawing' does not exist in the namespace `System'. Are you missing `System.Drawing' assembly reference?

f:id:esakun:20170619163323p:plain

Unityではunityというフォルダ内のプラグインファイルを使います。

  • zxing.unity.dll
  • zxing.unity.pdb
  • zxing.unity.xml

この3ファイルをUnityのProject内のPluginsフォルダにコピーします。
例 : Assets/Plugins/

3つのサンプルコードを書きました。

ファイル名 内容
CreateQRCodeWindow.cs QRコード生成用Editor拡張
QRCodeHelper.cs QRコード読み取り、生成用ヘルパークラス
SampleQRReader.cs QRコード読み取りサンプルソース

QRコードの作成

f:id:esakun:20170619194151p:plain

Window > QR からQRコード作成用WIndowが表示されます

f:id:esakun:20170619194244p:plain

テキストエリアに内容を入力してSaveボタンを押すとProject内にqr.pngというファイルが出来上がります。

少しハマった所 その1

動的にTexture2Dを生成する場合は、幅を2のべき乗にしないとエラーが出ます。 例えばW200 * H200とかにしてしまうと以下のようなエラーが出ます。

IndexOutOfRangeException: Array index is out of range.
ZXing.Color32Renderer.Render (ZXing.Common.BitMatrix matrix, BarcodeFormat format, System.String content, ZXing.Common.EncodingOptions options)
ZXing.BarcodeWriterGeneric`1[TOutput].Write (System.String contents)

しかしW256 * H200ではエラーは出ません。内部ロジックが分からないので原因は分かりません。

少しハマった所 その2

256以上のサイズだと 正常に画像が作られませんでした。
調査中です。とりあえず256pxで作成します。

f:id:esakun:20170619194608p:plain
1024px * 1024pxで制作すると正しくQRコードが作成されませんでした。

QRコードの読み取り

UnityEditor、Android環境では問題なく読み取りが行われます。

しかしiOSの場合はビルド後に一手間必要です。
iOS10以降からカメラなどのデバイスへアクセスする際、Info.plistにPrivacy - Camera Usage Descriptionを追加する必要があります。

f:id:esakun:20170620133920p:plain

Info.plistを 右クリック > Add Rowから追加できます。

追記2017.6.23
コメント欄 しろくろさんからの助言で、わざわざInfo.plistを弄る必要はありませんでした。 しろくろさん、情報ありがとうございます。

f:id:esakun:20170623100801p:plain

PlayerSettings > Other SettingsCamera Usage Descriptionを追加できるようになっておりました。
私のUnity最低バージョン5.5.2p2以降で確認できています。もっと前のバージョンから使用できるかもしれませんが未調査です。

余談

WebCamTexture を作成する前に、Application.RequestUserAuthorization を呼び出してください。

Unity - スクリプトリファレンス: WebCamTexture

yield return Application.RequestUserAuthorization (UserAuthorization.WebCam);

このコードをWebCamTextureを作成する前に実行してほしいという旨がリファレンスには記述がありますが、無くてもiOS、Android実機で動作することを確認しています。一応書きます。

f:id:esakun:20170620140146g:plain
※分かりづらいけど実機での動作

ライブラリ提供に感謝。

環境

  • Unity5.6.1p4
  • macOS 10.12.4
  • iOS 10.3.2
  • Android 5.0.2

参考

今回のサンプルコードはコチラです。