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 を置換する必要がなくなる
  • 安全で将来のアップデートにも強い

まとめ

  1. Unity 6 以降の TMP では uvs0 が Vector4[] に変更された
  2. 古いコードではそのままではコンパイルエラー(CS0029)が出る
  3. 対処法:
    • 簡単:Vector2[] → Vector4[] に書き換える
    • Mesh.uv に代入する場合:XY 成分だけ取り出す
    • 最も安全:古いTMPを使わず最新 TMP に置き換える

最後に

古い TMP サンプルを無理に使おうとすると、型変換エラーや予期せぬ不具合が多発します。Unity 6 以降では 最新 TMP を使うことが最も効率的で安全です。