Skip to content

QDA:QRコードテキスト確認(資料)

スクリプト上での流れ(chatgpt作成のもの)


全体像

  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を調整

Unity6でのビルド:

無加工で表示ができています。

114.jpg

Unity2022でのビルド:

表示部分の問題で表示できていないです。

ph.anagly.mediaprojectiondemo-20250114-144102.jpg

ただ、データとしては読み込めているようで

Barcode TrackerのOnReadBarcodesの部分でテキストを確認したところ無事に読み取れていることが確認できています。表示には、動作状態を表していたText (Legacy)を利用しています。

image.png115.jpg

Author: 水上 | Source: 水上\QDA:QRコードテキスト確認(資料) b13e3d0de2f0426eaab432a5b44e200d.md