Skip to content

QDA:QR文字列認識確認

image.png

QRコード周辺に現れる緑色の枠を発見同じprefab内にTextもあるのでこれにQRコードの文字列を表示させるっぽい

表示までの流れの予想

image.png

Screen Capture Texture ManagerにアタッチされているIndicatorDriverがprefabを管理している。

スクリプト上での流れ


全体像

  1. BarcodeReader (Androidプラグイン連携部分)
    • カメラ映像からバーコード(QRコード)を検出
    • 検出結果(文字列や座標)をJSONでUnityへ通知
    • OnReadBarcodesイベントを発火し、読み取った文字列を外部へ渡す
  2. BarcodeTracker (3D座標変換などの補助)
    • BarcodeReaderOnReadBarcodes を受け取り、読み取った文字列を自分のResult構造体に入れる
    • バーコードの2D座標→3D座標変換を行い、
    • OnTrackBarcodesイベントを発火し、変換後の座標や文字列を外部へ渡す
  3. IndicatorDriver (UI要素の管理)
    • BarcodeTrackerOnTrackBarcodes を受け取り、読み取った文字列をIndicatorに割り当てる
    • Indicatorオブジェクトを複数管理し、必要な数だけ表示/非表示を切り替える
  4. Indicator (実際のUI要素: TextMeshPro など)
    • IndicatorDriverから受け取った文字列を、textMesh (TMP_Text) にセットする
    • ここで初めてユーザが目にするテキストとして描画される

スクリプト間の文字の受け渡しの流れ

1. BarcodeReader がバーコード結果を受け取る

csharp

private void OnBarcodeResults(string json)
{
    Results results = JsonUtility.FromJson<Results>(json);
    OnReadBarcodes.Invoke(results.results);
}
  • Androidプラグイン側から呼ばれるコールバック (OnBarcodeResults) で、読み取られたバーコードの情報(文字列 text など)json で渡されます。
  • JSONをResult[]に変換し、OnReadBarcodes.Invoke(results.results) で通知します。

2. BarcodeTrackerBarcodeReader.OnReadBarcodes を受け取る

csharp

barcodeReader.OnReadBarcodes += OnReadBarcodes; // Awakeで登録

private void OnReadBarcodes(IEnumerable<BarcodeReader.Result> barcodeResults)
{
    results.Clear();

    foreach (BarcodeReader.Result barcodeResult in barcodeResults)
    {
        // 新しいResult構造体に文字列を入れる
        Result trackResult = new Result(barcodeResult.text);

        // ここで2D→3Dの座標変換 etc...
        // 変換後のコーナー座標を trackResult.corners に格納

        results.Add(trackResult);
    }

    // 変換が終わったら OnTrackBarcodes イベントで外部へ渡す
    OnTrackBarcodes.Invoke(results);
}
  • OnReadBarcodes が呼び出されると、
    1. バーコードごとに文字列を trackResult.text にセット
    2. 座標変換をして trackResult.corners に格納
    3. 最後に OnTrackBarcodes.Invoke(results) で (文字列 + 座標) のリストを渡す

3. IndicatorDriverBarcodeTracker.OnTrackBarcodes を受け取る

csharp

barcodeTracker.OnTrackBarcodes += OnTrackBarcodes; // Awakeで登録

private void OnTrackBarcodes(IEnumerable<BarcodeTracker.Result> results)
{
    int i = 0;
    foreach (BarcodeTracker.Result result in results)
    {
        if (i >= indicators.Count)
            InstantiateIndicator();

        indicators[i].gameObject.SetActive(true);

        // ここでIndicator.Set(result)を呼ぶ
        indicators[i].Set(result);
        i++;
    }

    // 使わないインジケータは非表示
    while (i < indicators.Count)
    {
        indicators[i].gameObject.SetActive(false);
        i++;
    }
}
  • OnTrackBarcodes の引数 results (各バーコード情報) を順に取り出す
  • indicatorPrefab のインスタンス(Indicator)を使って Indicator.Set(result) を呼び出し
  • ここが文字列をUI要素に反映する直前の段階です

4. Indicator が文字列を TextMeshPro にセット

csharp

public void Set(BarcodeTracker.Result result) => Set(result.text, result.corners);

public void Set(string text, Vector3[] corners)
{
    textMesh.text = text; // ← ここで文字列を画面に反映

    // cornersを使って位置や姿勢を調整
    Vector3 topCenter = (corners[2] + corners[3]) / 2f;
    transform.position = topCenter;

    // 角の位置をLineRendererで描画するなどの処理
    lineRenderer.SetPositions(offsetPositions);
}
  • Set(BarcodeTracker.Result result) で受け取った texttextMesh.text に代入
  • この瞬間に、バーコードで読み取られた文字が実際のUI(TMP_Text)に表示される
  • 座標情報(corners)をもとに自身の位置やLineRendererを調整

なぜ表示されないのか

1.そもそもprefabが悪い説

csharp
public void Set(BarcodeTracker.Result result) => Set(result.text, result.corners);

public void Set(string text, Vector3[] corners)
{
    //textMesh.text = text; // ← ここで文字列を画面に反映

    // cornersを使って位置や姿勢を調整
    Vector3 topCenter = (corners[2] + corners[3]) / 2f;
    transform.position = topCenter;

    // 角の位置をLineRendererで描画するなどの処理
    lineRenderer.SetPositions(offsetPositions);
}

コメントアウトで検証

→結局Textは見えず

文字化したらマテリアルとかが悪いかも

csharp
UnassignedReferenceException: The variable material of TMP_FontAsset has not been assigned.
You probably need to assign the material variable of the TMP_FontAsset script in the inspector.
UnityEngine.Material.GetTexture (System.Int32 nameID) (at <6ff3bcb667574bf9a8630184172fcfbf>:0)
TMPro.EditorUtilities.TMP_EditorUtility.FindMaterialReferences (TMPro.TMP_FontAsset fontAsset) (at ./Library/PackageCache/com.unity.textmeshpro@3.0.7/Scripts/Editor/TMP_EditorUtility.cs:125)
TMPro.EditorUtilities.TMP_BaseEditorPanel.GetMaterialPresets () (at ./Library/PackageCache/com.unity.textmeshpro@3.0.7/Scripts/Editor/TMP_BaseEditorPanel.cs:1230)

このエラーがずっと出ていた。しかしindicatorのTextマテリアルは

LiberationSans SDF - Drop Shadowを使用している。関係があるのか不明

バージョン変更せずにビルドをする(Unity6でのビルド)

114.jpg

文字がでた。。。

QRコードの上に表示させるTMPに問題がありそう

試しにMENU画面のRunnning!などと表示されている箇所をURLに変更してみる。

BarcodeTracker内での実装

115.jpg

ちゃんと読み込めてるっぽい

やはり表示部分でのエラー


Author: 水上 | Source: 水上\QDA:QR文字列認識確認 475c99e3a6424bd1a39993b6b372cfaa.md