こんにちは、Unityエンジニアのオオバです。

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

CodePlex Archive

UnityでiOS・Android実機で動くQRコードリーダーを作ってみた_0

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

ちなみに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?

UnityでiOS・Android実機で動くQRコードリーダーを作ってみた_1

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

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

3つのサンプルコードを書きました。
QR Code Creator EditorWindow · GitHub

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

👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

QRコードの作成

UnityでiOS・Android実機で動くQRコードリーダーを作ってみた_2

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

UnityでiOS・Android実機で動くQRコードリーダーを作ってみた_3

テキストエリアに内容を入力して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で作成します。

UnityでiOS・Android実機で動くQRコードリーダーを作ってみた_4

1024px * 1024pxで制作すると正しくQRコードが作成されませんでした。

QRコードの読み取り

Unityエディタ、Android環境では問題なく読み取りが行われます。

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

UnityでiOS・Android実機で動くQRコードリーダーを作ってみた_5

Add Rowから追加できます。

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

UnityでiOS・Android実機で動くQRコードリーダーを作ってみた_6

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

余談

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

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

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

yield return Application.  
    RequestUserAuthorization (UserAuthorization.WebCam);  

【動作の様子】

UnityでiOS・Android実機で動くQRコードリーダーを作ってみた_7

ライブラリ提供に感謝です。

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

オススメ記事
検証環境
参考サイト