UnityでQRコードを読み取る方法
UnityでQRコードを読み取る方法をご紹介します。
条件
- Unity 2020.2.7f1
- ZXing
- Android 10
zxing.unity.dllの入手
以下のサイトから、「ZXing.Net.0.16.6.0.zip」をダウンロードして解凍します。
https://github.com/micjahn/ZXing.Net/releases
ZXing.Net.0.16.6.0\unityフォルダにある「zxing.unity.dll」を取り出します。
プロジェクトの作成
テンプレートで3Dを選択し、適当なプロジェクト名を記入して作成します。
プロジェクトのAssetsの下に「Plugins」というフォルダを作り、「zxing.unity.dll」をドラッグアンドドロップで配置します。
QRコード作成
プロジェクトのAssetsの下に「Editor」というフォルダを作り、「CreateQRCode.cs」というC#スクリプトを追加します。
EditorWindowを継承し、[MenuItem(“Tools/Create QRCode”)]とすることで、ヘッダーのメニューにTools > Create QRCodeという選択肢が追加されます。
using UnityEngine;
using UnityEditor;
using ZXing;
using ZXing.QrCode;
using System.IO;
public class CreateQRCode : EditorWindow
{
[MenuItem("Tools/Create QRCode")]
static void Init()
{
var window = EditorWindow.GetWindow<CreateQRCode>();
window.Show();
}
string _content = "";
void OnGUI()
{
// 保存するQRコードの画像ファイル名
var path = Application.dataPath + "/QRCode.png";
// テキストエリアから入力した文字を取得
_content = GUILayout.TextArea(_content, GUILayout.Height(30f));
EditorGUI.BeginDisabledGroup(string.IsNullOrEmpty(_content));
if (GUILayout.Button("Save"))
{
// QR コードの画像の幅と高さ
var width = 256;
var height = 256;
var writer = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE,
Options = new QrCodeEncodingOptions
{
Width = width,
Height = height
}
};
var format = TextureFormat.ARGB32;
var texture = new Texture2D(width, height, format, false);
var colors = writer.Write(_content);
texture.SetPixels32(colors);
texture.Apply();
using (var stream = new FileStream(path, FileMode.OpenOrCreate))
{
var bytes = texture.EncodeToPNG();
stream.Write(bytes, 0, bytes.Length);
}
AssetDatabase.Refresh();
ShowNotification(new GUIContent("QRコードを作成しました。"));
}
EditorGUI.EndDisabledGroup();
}
}
テキストエリアに任意の文字列を記入して、Saveボタンを押すとAssetsの下に「QRCode.png」が生成されます。
QRコード読み取り
プロジェクトのAssetsの下に「Scripts」というフォルダを作り、「ReadQRCode.cs」というC#スクリプトを追加します。
using UnityEngine;
using UnityEngine.Android;
using UnityEngine.UI;
using ZXing;
public class ReadQRCode : MonoBehaviour
{
private const string PERMISSION = Permission.Camera;
public Text m_text;
public RawImage m_rawImage;
private WebCamTexture m_webCamTexture;
private void Awake()
{
// カメラの使用許可リクエスト
Permission.RequestUserPermission(PERMISSION);
}
private void Update()
{
// カメラの準備が出来ていない場合
if (m_webCamTexture == null)
{
// カメラの使用が許可された場合
if (Permission.HasUserAuthorizedPermission(PERMISSION))
{
var width = Screen.width;
var height = Screen.height;
m_webCamTexture = new WebCamTexture(width, height);
// カメラの使用を開始
m_webCamTexture.Play();
// カメラが写している画像をゲーム画面に表示
m_rawImage.texture = m_webCamTexture;
}
}
else
{
// カメラが写している QRコードからデータを取得し、ゲーム画面に表示
m_text.text = Read(m_webCamTexture);
}
}
private static string Read(WebCamTexture texture)
{
var reader = new BarcodeReader();
var rawRGB = texture.GetPixels32();
var width = texture.width;
var height = texture.height;
var result = reader.Decode(rawRGB, width, height);
return result != null ? result.Text : string.Empty;
}
}
次に、HierarchyのSampleSceneに、Create Emptyで空のGameObjectを追加します。
追加した空のGameObjectに対して、ReadQRCode.csをドラッグアンドドロップしてスクリプトを紐づけます。
HierarchyのSampleSceneに、UI > Canvasを追加します。
さらに、Canvasに「UI > Text」と「UI > RawImage」を追加します。
画面の表示を設定するために、Gameタブで「16:9 Portrait」を選択します。
Canvas > Textを選択して、Inspectorで表示場所やサイズなどを指定します。
今回は、以下のように設定しました。
同様に、Canvas > RawImageを選択して、Inspectorで表示場所やサイズなどを指定します。
今回は、以下のように設定しました。
Canvas > GameObjectを選択して、InspectorでTextとRawImageに、上記で作成&設定したTextとRawImageを割り当てます。
ビルド&実行
File > Build Settings で、PlatformにAndroidを選択しSwitch Platformボタンを押します。
Build And Runボタンを押して、ビルドと実行を行います。
初回起動時、写真と動画の撮影の許可ダイアログが表示されるので、「許可」を選択します。
アプリ起動中にQRコードをカメラで読み込むと、上部にQRコードの内容が表示されます。
参考
【Unity】Android で QR コードからデータを読み込む方法
UnityでiOS・Android実機で動くQRコードリーダーを作ってみた


















