Appearance
QDA:QR文字列認識確認

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

Screen Capture Texture ManagerにアタッチされているIndicatorDriverがprefabを管理している。
スクリプト上での流れ
全体像
BarcodeReader(Androidプラグイン連携部分)- カメラ映像からバーコード(QRコード)を検出
- 検出結果(文字列や座標)をJSONでUnityへ通知
OnReadBarcodesイベントを発火し、読み取った文字列を外部へ渡す
BarcodeTracker(3D座標変換などの補助)BarcodeReaderのOnReadBarcodesを受け取り、読み取った文字列を自分のResult構造体に入れる- バーコードの2D座標→3D座標変換を行い、
OnTrackBarcodesイベントを発火し、変換後の座標や文字列を外部へ渡す
IndicatorDriver(UI要素の管理)BarcodeTrackerのOnTrackBarcodesを受け取り、読み取った文字列をIndicatorに割り当てるIndicatorオブジェクトを複数管理し、必要な数だけ表示/非表示を切り替える
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. BarcodeTracker が BarcodeReader.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が呼び出されると、- バーコードごとに文字列を
trackResult.textにセット - 座標変換をして
trackResult.cornersに格納 - 最後に
OnTrackBarcodes.Invoke(results)で (文字列 + 座標) のリストを渡す
- バーコードごとに文字列を
3. IndicatorDriver が BarcodeTracker.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)で受け取ったtextをtextMesh.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でのビルド)

文字がでた。。。
QRコードの上に表示させるTMPに問題がありそう
試しにMENU画面のRunnning!などと表示されている箇所をURLに変更してみる。
BarcodeTracker内での実装

ちゃんと読み込めてるっぽい
やはり表示部分でのエラー
Author: 水上 | Source:
水上\QDA:QR文字列認識確認 475c99e3a6424bd1a39993b6b372cfaa.md