Unity 6 / TextMeshPro で古いサンプルが動かない時の対処法まとめ
Unity の古いプロジェクトを Unity 6(Unity 2020以降)で開いたとき、TextMeshPro(TMP)のコードがコンパイルエラーを出すことがあります。特に CS0029: Cannot implicitly convert type 'Vector4[]' to 'Vector2[]'
というエラーが多発します。本記事では、その原因と解決方法をまとめました。
なぜコンパイルエラーが起きるのか?
古い TMP では以下のようなコードがあります。
Vector2[] uvs0 = textInfo.meshInfo[materialIndex].uvs0;
しかし、Unity 6 以降の TMP では uvs0 の型が Vector2[] から Vector4[] に変更されました。そのため、古いコードのままではコンパイルエラーになります。
エラー例
CS0029: Cannot implicitly convert type 'UnityEngine.Vector4[]' to 'UnityEngine.Vector2[]'
VertexZoom.cs
textInfo.meshInfo[i].mesh.uv = textInfo.meshInfo[i].uvs0;
これらは、TMP 内部データの型変更に起因しています。
解決策 1:型を Vector4[] に変更する
最も簡単な方法は、古いコードの宣言を Vector4[] に置き換えることです。
// 旧コード
Vector2[] uvs0 = textInfo.meshInfo[materialIndex].uvs0;
// 修正版
Vector4[] uvs0 = textInfo.meshInfo[materialIndex].uvs0;
- XY 成分しか使わない場合でもほとんど問題なく動作
- TMP_TextSelector_B.cs や VertexZoom.cs の古いサンプルに適用可能
解決策 2:Mesh.uv に代入する場合は XY 成分だけ取り出す
TMP 内部は Vector4[] ですが、Mesh.uv
は Vector2[] しか受け付けません。そのまま代入するとエラーになります。
Vector4[] uvs4 = textInfo.meshInfo[i].uvs0;
Vector2[] uvs2 = new Vector2[uvs4.Length];
for (int j = 0; j < uvs4.Length; j++)
{
uvs2[j] = new Vector2(uvs4[j].x, uvs4[j].y);
}
textInfo.meshInfo[i].mesh.uv = uvs2;
- XY 成分だけコピーする安全な方法
- ループを使わずに1行で書くなら:
textInfo.meshInfo[i].mesh.uv = Array.ConvertAll(textInfo.meshInfo[i].uvs0, v => new Vector2(v.x, v.y));
解決策 3:古い TMP を使わず最新TMPに置き換える(推奨)
Unity 6 以降では、TMP はパッケージとして統合されており、古いアップグレード機能は廃止されています。
- 手動で Vector2 → Vector4 を置換する必要がなくなる
- 安全で将来のアップデートにも強い
まとめ
- Unity 6 以降の TMP では
uvs0
が Vector4[] に変更された - 古いコードではそのままではコンパイルエラー(CS0029)が出る
- 対処法:
- 簡単:Vector2[] → Vector4[] に書き換える
- Mesh.uv に代入する場合:XY 成分だけ取り出す
- 最も安全:古いTMPを使わず最新 TMP に置き換える
最後に
古い TMP サンプルを無理に使おうとすると、型変換エラーや予期せぬ不具合が多発します。Unity 6 以降では 最新 TMP を使うことが最も効率的で安全です。
ディスカッション
コメント一覧
まだ、コメントがありません