やっほー!みんなのUnity開発サポーター、ヒロだよ!
Unityでゲーム作ってるとさ、たまーにコンソールに赤い文字が出てきて「うわっ、何これ!?」ってビックリすること、あるよね?英語だし、なんだか難しそうに見えちゃって、そこで手が止まっちゃう…なんてことも。
でもね、心配ご無用!エラーメッセージって、実はUnityが「ヒロくん(キミのことね!)、ここ、ちょっと見てほしいな~」って教えてくれてる、超親切なサインなんだ。だから、エラーが出ても慌てないで!
今日は、ヒロがUnityでよく見かけるエラーメッセージを30個ピックアップして、分かりやす~く解説しちゃうよ!「こんな時はこうするといいかも?」っていうヒントも付けておくから、エラーが出てもへっちゃらになっちゃうはず!
エラーを味方につけて、もっともっとUnity開発を楽しんじゃおう!
- Unityエラーメッセージ解読ツアー!これで怖くない!
- 1. NullReferenceException: Object reference not set to an instance of an object.
- 2. IndexOutOfRangeException: Index was outside the bounds of the array.
- 3. ArgumentNullException: Value cannot be null.
- 4. MissingComponentException: There is no ‘コンポーネント名’ attached to the ‘オブジェクト名’ game object, but a script is trying to access it.
- 5. UnassignedReferenceException: The variable ‘変数名’ of ‘スクリプト名’ has not been assigned.
- 6. CS0103: The name ‘変数名やメソッド名’ does not exist in the current context.
- 7. CS0246: The type or namespace name ‘型名や名前空間名’ could not be found (are you missing a using directive or an assembly reference?).
- 8. CS1061: ‘型名’ does not contain a definition for ‘メンバー名’ and no accessible extension method ‘メンバー名’ accepting a first argument of type ‘型名’ could be found (are you missing a using directive or an assembly reference?).
- 9. CS0165: Use of unassigned local variable ‘変数名’.
- 10. CS0029: Cannot implicitly convert type ‘型A’ to ‘型B’.
- 11. The file ‘ファイルパス’ could not be found.
- 12. Assertion failed on expression: ‘条件式’
- 13. GameObject has been destroyed but you are still trying to access it.
- 14. Cannot add component ‘コンポーネント名’ because it is already added to the game object ‘オブジェクト名’.
- 15. The referenced script (Unknown) on this Behaviour is missing!
- 16. ‘スクリプト名’ AnimationEvent ‘イベント名’ has no receiver! Are you missing a component?
- 17. Scene ‘シーン名’ couldn’t be loaded because it has not been added to the build settings.
- 18. Instantiate Failed because the clone was destroyed during creation.
- 19. StackOverflowException
- 20. OutOfMemoryException
- 21. CS0117: ‘型名’ does not contain a definition for ‘静的メンバー名’.
- 22. The name ‘名前’ does not denote a valid type (‘not found’).
- 23. A namespace cannot directly contain members such as fields or methods.
- 24. Look rotation viewing vector is zero.
- 25. Screen position out of view frustum.
- 26. Material doesn’t have a texture property ‘_MainTex’.
- 27. The type UnityEngine.Something exists in both UnityEngine.dll and UnityEngine.SomeModule.dll.
- 28. Transform.SetParent internal call failed!
- 29. Can’t add script component ‘スクリプト名’ because the script class cannot be found. Make sure that there are no compile errors and that the file name and class name match.
- 30. All compiler errors have to be fixed before you can enter playmode!
- UdonSharpエラー解決への近道!ヒロと学ぶ30のポイント!
- 【Unityエラー大辞典!?】ヒロと学ぶ!エラー&警告150連発!原因と対策のヒント集!
- Unityエラー&警告150連発!これでキミもデバッグマスター!?
- 【コンパイルエラー (CSシリーズなど) – スクリプトの文法や参照の問題】
- 【NullReferenceException とその仲間たち – オブジェクトが見つからない系】
- 【配列・リスト関連のエラー – 範囲外アクセスなど】
- 【UdonSharp特有のエラー・警告 – VRChatワールド制作向け】
- 【Unityエディタ・ビルド・アップロード関連のエラー】
- 【実行時エラー (Runtime Errors) – ゲーム実行中に発生】
- 【警告 (Warnings) – 黄色いメッセージ、エラーじゃないけど注意!】
- 【VRChat SDK & ワールド設定関連の警告・問題点】
- 【一般的なUnity操作・設定ミスなど】
- エラーは友達!怖がらずに仲良くなろう!
- 【VRChatワールド制作】「ヨドコロちゃんのタグマーカー」トラブル解決ガイド!エラーかな?と思ったらココをチェック!
- 「ヨドコロちゃんのタグマーカー」困ったときのチェックリスト!
- 1. ボタンが反応しない…!
- 2. ボタンと違う内容のタグが付いちゃう!
- 3. マーカーが出ない人がいるんだけど…
- 4. マーカーがLQ Mirror(ロークオリティミラー)に映らない!
- 5. Unityエディタ上で実行するとエラーが出る!
- 6. 一部の文字が消えたり、チカチカしたりする…
- 7. タグを「どれか一つだけ選ぶ」みたいにしたいんだけど… (排他的動作)
- 8. ワールドに入った時に、最初から特定のタグを付けておきたい! (デフォルト設定)
- 9. 他の人のタグを、私が強制的に変えたいんだけど!
- 10. なんだかワールドの容量がすごく大きくなっちゃった…
- 11. タグマーカーサポーターで作った操作パネルやマーカーの幅・高さが合わない!
- 12. タグをいっぱい付けると、アバターの頭とかにめり込んじゃう!
- エラーはキミの相棒!UdonSharpともっと仲良くなろう!
- エラーは怖くない!キミの成長のバネにしちゃおう!
Unityエラーメッセージ解読ツアー!これで怖くない!
1. NullReferenceException: Object reference not set to an instance of an object.
- 日本語にすると…: 「あれれ?参照しようとしてるもの、まだ何にも入ってない箱みたいだよ!」
- こんな時のヒント!:
- これ、本当によく見るエラーナンバーワンかも!スクリプトの中で、まだ空っぽの変数を使おうとしちゃった時に出るんだ。
- インスペクターでオブジェクトをドラッグ&ドロップし忘れてない? GetComponent<>() で何か取ってこようとして、うまく取れてないのかも。
- エラーが出た行の変数が、ちゃーんと「これだよ!」って指さしてるか、もう一度チェックしてみてね!
2. IndexOutOfRangeException: Index was outside the bounds of the array.
- 日本語にすると…: 「おっと!配列の箱、そんな番号のところにはないみたいだよ!」
- こんな時のヒント!:
- 配列とかリストって、番号が決まってる箱みたいなものなんだけど、その番号の範囲外を見ようとしちゃった時に出るんだ。例えば、3つしか箱がないのに、4番目の箱を開けようとした感じ!
- ループ処理の回数とか、配列の大きさをもう一度確認してみて!「あれ、思ったより箱が少なかった!」ってこと、あるあるだよ。
3. ArgumentNullException: Value cannot be null.
- 日本語にすると…: 「ごめんね、この引数には何か入れてくれないと困っちゃうんだ!」
- こんな時のヒント!:
- メソッド(関数)を呼ぶときに、渡すもの(引数)が空っぽ(null)だとダメだよーって言われてるんだ。
- メソッドに渡してる変数が、本当に何か中身が入ってるか見てみて!
4. MissingComponentException: There is no ‘コンポーネント名’ attached to the ‘オブジェクト名’ game object, but a script is trying to access it.
- 日本語にすると…: 「’オブジェクト名’くんに’コンポーネント名’っていう部品、付いてないみたいだけど、探してるの?」
- こんな時のヒント!:
- スクリプトが、ゲームオブジェクトに付いてない部品(コンポーネント)を探しちゃってる時に出るよ。
- GetComponent<>() で探してる部品、本当にそのオブジェクトに付いてるかな?うっかり付け忘れちゃったり、名前を間違えちゃったりしてない?インスペクターで確認だ!
5. UnassignedReferenceException: The variable ‘変数名’ of ‘スクリプト名’ has not been assigned.
- 日本語にすると…: 「’スクリプト名’の中の’変数名’くん、まだ誰とも繋がってないみたいだよー!」
- こんな時のヒント!:
- インスペクターで何かをドラッグ&ドロップして設定するはずの変数が、空っぽのままになっちゃってる時に出るんだ。
- エラーメッセージに出てるスクリプトと変数名を見て、インスペクターでその場所にちゃんとしたオブジェクトやプレハブをセットしてあげてね!
6. CS0103: The name ‘変数名やメソッド名’ does not exist in the current context.
- 日本語にすると…: 「あれ?’変数名やメソッド名’くん、見当たらないなぁ…どこ行っちゃったんだろ?」
- こんな時のヒント!:
- これはコンパイルエラーって言って、スクリプトを実行する前に「ここ、おかしいよ!」って教えてくれるやつ。まだ作ってない変数やメソッドを使おうとしたり、名前を打ち間違えたりすると出るよ。
- スペルミスしてない?大文字と小文字もちゃんと合ってる?もう一度よーく見てみて!
7. CS0246: The type or namespace name ‘型名や名前空間名’ could not be found (are you missing a using directive or an assembly reference?).
- 日本語にすると…: 「’型名や名前空間名’っていう設計図、見つからないよ~(もしかして、使うよ宣言か部品の参照、忘れてない?)」
- こんな時のヒント!:
- これもコンパイルエラー。存在しないクラス名とかを使おうとしたり、スクリプトの最初に「これ使うよ!」って書く using UnityEngine; みたいなのを忘れちゃったりすると出るんだ。
- スクリプトのてっぺん、ちゃんと using って書いてあるかな?外部のすごい道具(アセット)を使ってるなら、それを使うための設定も確認してみてね。
8. CS1061: ‘型名’ does not contain a definition for ‘メンバー名’ and no accessible extension method ‘メンバー名’ accepting a first argument of type ‘型名’ could be found (are you missing a using directive or an assembly reference?).
- 日本語にすると…: 「’型名’ちゃんに’メンバー名’っていう技、持ってないみたいだよ…(もしかして、使うよ宣言か部品の参照、忘れてない?)」
- こんな時のヒント!:
- これもコンパイルエラー。あるクラスとかに、持ってない技や能力(メソッドやプロパティ)を使わせようとしちゃった時に出るよ。
- 技の名前、間違ってない?そのクラス、本当にその技を持ってる? GetComponent<>() で取ってきた部品の種類が、思ってたのと違ったりしないかな?
9. CS0165: Use of unassigned local variable ‘変数名’.
- 日本語にすると…: 「おっと、’変数名’くん、まだ何も入ってないのに使おうとしてるよ!」
- こんな時のヒント!:
- これもコンパイルエラー。メソッドの中で作った変数(ローカル変数)に、まだ何も入れてないのに使おうとすると「待った!」がかかるんだ。
- 変数を使う前には、ちゃーんと何か入れてあげてね!
10. CS0029: Cannot implicitly convert type ‘型A’ to ‘型B’.
- 日本語にすると…: 「ごめんね、’型A’をそのまま’型B’の箱には入れられないみたい…」
- こんな時のヒント!:
- これもコンパイルエラー。違う種類のものを、無理やり同じ箱に入れようとしちゃった時に出るんだ。例えば、整数の箱に小数をそのまま入れようとした感じ!
- 「こういう風に変身させて!」ってお願い(キャスト)が必要だったり、そもそも入れるものや箱の種類が間違ってないか、見てみよう!
11. The file ‘ファイルパス’ could not be found.
- 日本語にすると…: 「あれれ?’ファイルパス’にあるはずのファイル、見つからないよ~!」
- こんな時のヒント!:
- スクリプトとかアセットとか、Unityが探してるファイルが、言われた場所にない時に出るよ。
- ファイルの名前やフォルダの名前、間違ってない?もしかして、ファイルを移動しちゃったり、消しちゃったりしてないかな?
12. Assertion failed on expression: ‘条件式’
- 日本語にすると…: 「むむっ!’条件式’がこうなるはずだったのに、違うみたいだぞ!」
- こんな時のヒント!:
- これはね、キミが「ここは絶対こうなるはず!」ってプログラムに仕込んだチェックポイント(アサーション)で、予想と違う結果になっちゃった時に出るんだ。
- デバッグのためにわざと置いたものだから、プログラムの動きが思ってたのと違うってこと。どこがおかしいか、じっくり見てみよう!
13. GameObject has been destroyed but you are still trying to access it.
- 日本語にすると…: 「あーん、そのゲームオブジェクト、もう壊しちゃった後なのに、まだ何かさせようとしてるよ!」
- こんな時のヒント!:
- Destroy() で消しちゃったゲームオブジェクトに、消えた後で何かお願いしようとすると出るんだ。
- 消えちゃう可能性があるオブジェクトに何かする前は、「本当にいるかな?」って確認(nullチェック)するといいよ。コルーチンの中でよく見るエラーかも!
14. Cannot add component ‘コンポーネント名’ because it is already added to the game object ‘オブジェクト名’.
- 日本語にすると…: 「’オブジェクト名’くんには、もう’コンポーネント名’が付いてるから、これ以上付けられないよ~!」
- こんな時のヒント!:
- 同じ種類の部品(コンポーネント)を、一つのゲームオブジェクトに2個も3個も付けようとしちゃった時に出るんだ(特別な部品以外は1個までね!)。
- AddComponent<>() する前に、「もう付いてないかな?」って確認するといいかも。
15. The referenced script (Unknown) on this Behaviour is missing!
- 日本語にすると…: 「この部品(Behaviour)にくっついてるはずの設計図(スクリプト)、迷子になっちゃったみたい!」
- こんな時のヒント!:
- ゲームオブジェクトに付けてたスクリプトファイルが、プロジェクトの中からいなくなっちゃったり、名前が変わっちゃったりすると出るよ。
- インスペクターで「Missing Script」って泣いてる場所を探して、正しいスクリプトをもう一度付けてあげるか、いらないならその部品ごと消しちゃおう!
16. ‘スクリプト名’ AnimationEvent ‘イベント名’ has no receiver! Are you missing a component?
- 日本語にすると…: 「’スクリプト名’のアニメーションイベント’イベント名’くん、誰にお願いすればいいか分からないみたい!(部品、足りなくない?)」
- こんな時のヒント!:
- アニメーションの途中で「この関数を呼んで!」ってお願い(アニメーションイベント)したのに、その関数を持ってるスクリプトが見つからない時に出るんだ。
- 関数名、間違ってない?そのスクリプト、ちゃんとアニメーションが付いてるオブジェクトに付いてるかな?
17. Scene ‘シーン名’ couldn’t be loaded because it has not been added to the build settings.
- 日本語にすると…: 「シーン’シーン名’、ゲームに入れるリストに入ってないから、呼べないよ~!」
- こんな時のヒント!:
- SceneManager.LoadScene() で新しいステージ(シーン)に行こうとしたのに、そのステージが「このゲームに入れますよ」っていうリスト(ビルド設定)に入ってない時に出るんだ。
- 「File」メニューから「Build Settings…」を開いて、「Scenes In Build」っていうところに、そのステージのファイルをドラッグ&ドロップしてあげてね!
18. Instantiate Failed because the clone was destroyed during creation.
- 日本語にすると…: 「プレハブをコピーしようとしたら、コピー中に壊れちゃったみたいで失敗しちゃった…」
- こんな時のヒント!:
- 設計図(プレハブ)から新しいオブジェクトを作ろうとした時に、その設計図の Awake() とか OnEnable() っていう「生まれた時」の処理の中で、自分自身を消しちゃう(Destroy())ようなことをしてると、このエラーが出ることがあるよ。
- プレハブが生まれる時の処理、もう一度見直してみて!
19. StackOverflowException
- 日本語にすると…: 「うわぁ~!お願いの処理が積み重なりすぎて、パンクしちゃった~!」
- こんな時のヒント!:
- メソッドが自分自身を無限に呼び続けちゃったり(再帰呼び出しの無限ループ)、すごくたくさんのメソッドが次々に呼ばれすぎて、Unityが覚えきれなくなっちゃうと出るんだ。
- 再帰関数の終わる条件、ちゃんと設定されてる?どこかで無限ループしてないかな?
20. OutOfMemoryException
- 日本語にすると…: 「大変だー!メモリがもういっぱいで、何も覚えられないよー!」
- こんな時のヒント!:
- プログラムが使えるメモリを全部食べ尽くしちゃった時に出るよ。
- すっごく大きな画像とか、たくさんのオブジェクトを一度に作ろうとしたり、どこかでメモリを解放し忘れてたり(メモリリーク)してないかな?メモリプロファイラっていう道具で、どこでメモリをいっぱい使ってるか調べてみよう!
21. CS0117: ‘型名’ does not contain a definition for ‘静的メンバー名’.
- 日本語にすると…: 「’型名’ちゃんに、みんなで使える’静的メンバー名’っていう道具、持ってないみたいだよ。」
- こんな時のヒント!:
- これもコンパイルエラー。クラスに直接くっついてる、みんなで共有して使える特別な変数やメソッド(静的メンバー)を使おうとしたけど、名前が間違ってたり、そもそもそんな道具がなかったりすると出るよ。
- 静的メンバーの名前、合ってる?そのクラス、本当にそれ持ってる?
22. The name ‘名前’ does not denote a valid type (‘not found’).
- 日本語にすると…: 「’名前’っていうの、ちゃんとした設計図の名前じゃないみたい(見つからないよ!)。」
- こんな時のヒント!:
- これもコンパイルエラー。「こういう種類のものをください!」ってお願いするところで、変な名前を言っちゃった時に出るんだ。
- 設計図(型名)の名前、スペルミスしてない? using って書くの、忘れてないかな?
23. A namespace cannot directly contain members such as fields or methods.
- 日本語にすると…: 「名前空間っていう大きな部屋の中に、いきなり机(変数)や道具(メソッド)は置けないんだよ~。」
- こんな時のヒント!:
- これもコンパイルエラー。名前空間 (namespace) っていう、プログラムを整理するための大きな仕切りの中に、直接変数とかメソッドを書こうとすると「ダメだよ!」って言われちゃう。
- 変数とかメソッドは、ちゃんとクラスとか構造体っていう、もっと小さな箱の中に入れてあげてね!
24. Look rotation viewing vector is zero.
- 日本語にすると…: 「どっちを向けばいいか、分からなくなっちゃったみたい…(見る方向がゼロだよ!)」
- こんな時のヒント!:
- Quaternion.LookRotation() っていう「こっちを向いて!」ってお願いする機能を使う時に、どっちを向いていいか分からなくなっちゃうと出るんだ。
- 「こっちだよ!」って教えてる方向のベクトルが、ゼロになっちゃってない?「上はこっちだよ!」って教えてる方向と、向きたい方向が真逆だったり、同じ方向だったりしないかな?
25. Screen position out of view frustum.
- 日本語にすると…: 「ありゃ、そのオブジェクト、カメラから見えないところにいるみたいだよ。」
- こんな時のヒント!:
- 3Dの世界のものをカメラの画面のどこに映るか計算したんだけど、カメラの見える範囲の外にいた時に出るよ(エラーじゃなくて、黄色い警告で出ることが多いかな)。
- 「あれ、見えるはずなのに…」って時は、オブジェクトの位置やカメラの位置・向きを確認してみて!
26. Material doesn’t have a texture property ‘_MainTex’.
- 日本語にすると…: 「このマテリアルさん、’_MainTex’っていう絵を貼る場所、持ってないみたいだよ。」
- こんな時のヒント!:
- スクリプトからマテリアルのメインの絵(テクスチャ)を操作しようとしたんだけど、使ってるシェーダーに _MainTex っていう名前の絵を貼る場所がない時に出るんだ。
- シェーダーのプロパティ名、間違ってない?違う名前で絵を貼る場所が用意されてるのかも。
27. The type UnityEngine.Something exists in both UnityEngine.dll and UnityEngine.SomeModule.dll.
- 日本語にすると…: 「あれれ? UnityEngine.Something っていう同じ名前の設計図が、UnityEngine.dll と UnityEngine.SomeModule.dll のどっちにも入ってるみたい!どっちを使えばいいの~?」
- こんな時のヒント!:
- これもコンパイルエラー。同じ名前のクラスとかが、違う部品ファイル(DLL)の中に2つ以上見つかっちゃった時に出るんだ。
- Unityのバージョンを上げた時とか、違うバージョンの道具を一緒に入れちゃった時によく見るかも。どっちか使わない方を消したり、Unityがどっちを使えばいいか分かるように教えてあげたりする必要があるよ。
28. Transform.SetParent internal call failed!
- 日本語にすると…: 「オブジェクトの親子関係を作ろうとしたんだけど、なんだか上手くいかなかったみたい…」
- こんな時のヒント!:
- オブジェクトを別のオブジェクトの子どもにしようとする transform.SetParent() っていうお願いが失敗した時に出るよ。
- 親にしようとしたオブジェクトが、もう壊れちゃってたりしない?子どもにしようとしたオブジェクトが、逆に親の親だったりして、変な親子関係になっちゃってないかな?
29. Can’t add script component ‘スクリプト名’ because the script class cannot be found. Make sure that there are no compile errors and that the file name and class name match.
- 日本語にすると…: 「スクリプト’スクリプト名’を部品として付けようとしたんだけど、設計図が見つからないよ!コンパイルエラーがないか、ファイル名とクラス名がちゃんと合ってるか、見てみて!」
- こんな時のヒント!:
- ゲームオブジェクトにスクリプトを付けようとした時に、そのスクリプトのファイル名と、スクリプトの中に書いてあるクラスの名前 (public class スクリプト名 : MonoBehaviour の スクリプト名 の部分ね!) がピッタリ合ってないとダメなんだ。
- 大文字・小文字もちゃんと合ってるか確認してね!あと、他のコンパイルエラーが残ってると、それも原因になったりするよ。
30. All compiler errors have to be fixed before you can enter playmode!
- 日本語にすると…: 「プレイモードで遊ぶ前に、コンソールに出てる赤いエラー、全部直さないとダメだよ~!」
- こんな時のヒント!:
- これはUnityからの最後通告みたいなもの!スクリプトにコンパイルエラーが残ってるのに、再生ボタンを押そうとすると「待った!」がかかるんだ。
- まずはコンソールの赤いメッセージを全部やっつけないと、ゲームのテストはできないよ。一つずつ、落ち着いて直していこうね!
UdonSharpエラー解決への近道!ヒロと学ぶ30のポイント!
UdonSharpはC#のサブセットであり、通常のC#とは異なる制約があるため、特有のエラーに遭遇することがあります。この記事で、UdonSharpとの付き合い方が少しでも楽になれば嬉しいです!
【UdonSharpの基本とコンパイル関連】
- UdonSharp.Compiler.NotUserProvidedException: The C# field … is not exposed to Udon and cannot be accessed.
- 日本語にすると…: 「あれれ?そのC#の変数、Udonの世界では使えないみたいだよ!」
- こんな時のヒント!:
- UdonSharpでは、Unityの全ての型やメンバーが使えるわけじゃないんだ。特にprivateな変数や、Udonがサポートしてない型の変数に直接アクセスしようとするとこのエラーが出ることがあるよ。
- 変数をpublicにしてみたり、Udonが使える型(VRCPlayerApiとか、基本的な型)を経由してアクセスできないか考えてみて!
- UdonSharp.Compiler.UdonSharpCompilerException: Method … cannot be exposed to Udon, it must be an instance method or a static C# method.
- 日本語にすると…: 「そのメソッド、Udonの世界には持っていけないみたい。インスタンスメソッドか、普通のC#の静的メソッドじゃないとダメなんだ。」
- こんな時のヒント!:
- UdonSharpから呼び出せるメソッドには制約があるんだ。例えば、拡張メソッドとか、一部の特殊なメソッドは直接公開できないことがあるよ。
- 普通のインスタンスメソッド(クラスのメンバーとして定義されたメソッド)にするか、UdonBehaviourに直接関係ない処理ならC#のstaticメソッドとして分けて作れないか試してみて!
- UdonSharp.Compiler.UdonSharpCompilerException: Recursive UdonBehaviour program compilation detected. This is not supported.
- 日本語にすると…: 「おっと!UdonBehaviourのプログラムが、自分自身をコンパイルしようとしてるみたい!それはできないんだ~。」
- こんな時のヒント!:
- UdonSharpのスクリプトが、コンパイル中に別のUdonSharpスクリプトを参照し、その参照先もまた元のスクリプトを参照している…みたいな循環参照が起きている可能性があるよ。
- スクリプト間の依存関係を見直して、循環しないように設計を変えてみて!
- The type or namespace name ‘SomeType’ could not be found (are you missing a using directive or an assembly reference?) (UdonSharpで特定のUnity APIを使おうとした場合)
- 日本語にすると…: 「’SomeType’っていう設計図、見つからないよ~(もしかして、usingで宣言し忘れてるか、必要な部品が入ってないかも?)」
- こんな時のヒント!:
- UdonSharpでも、UnityのAPIを使うときはちゃんとusing UnityEngine;とか、必要な名前空間を宣言しないとダメだよ。
- 特に、VRChat SDK特有のAPI(VRC.SDKBaseとかVRC.Udon)を使うときは、それに対応するusing宣言を忘れずにね!
- CS0103: The name ‘udonBehaviour’ does not exist in the current context. (UdonBehaviourの変数名を間違えた場合など)
- 日本語にすると…: 「あれ?’udonBehaviour’くん、見当たらないなぁ…」
- こんな時のヒント!:
- UdonSharpのスクリプト内で、他のUdonBehaviourを参照する変数名とか、Udonの機能にアクセスするためのキーワードのスペルを間違えちゃってるかも。
- GetComponent<UdonBehaviour>()で取得した変数の名前とか、SendCustomEvent()の対象のUdonBehaviour変数名とか、もう一度よーく確認してみて!
【同期変数 (Synced Variables) 関連】
- UdonSharp.Compiler.UdonSharpCompilerException: Synced variables cannot be of type ‘UnsupportedType’.
- 日本語にすると…: 「ごめんね、同期変数に’UnsupportedType’っていう種類は使えないんだ。」
- こんな時のヒント!:
- UdonSharpの同期変数([UdonSynced]って付けるやつね!)にできる型には制限があるんだ。複雑なクラスとか、一部の構造体は同期できないよ。
- 使えるのは、bool, byte, sbyte, char, short, ushort, int, uint, long, ulong, float, double, string, VRCPlayerApi, Vector2/3/4, Quaternion, Color, Color32 とか、基本的なものだよ。配列も一部OK!
- UdonSharp.Compiler.UdonSharpCompilerException: Synced variable … is not public. Synced variables must be public.
- 日本語にすると…: 「同期変数くん、publicじゃないとダメなんだよ~!」
- こんな時のヒント!:
- [UdonSynced]を付けた同期変数は、必ずpublicで宣言しないといけないルールなんだ。privateとかprotectedにしちゃってないかな?
- UdonSharp.Compiler.UdonSharpCompilerException: Cannot set synced variable … directly from an UdonSharpBehaviour that does not own it.
- 日本語にすると…: 「その同期変数、キミの持ち物じゃないから直接書き換えられないよ!」
- こんな時のヒント!:
- 同期変数の値を変更できるのは、基本的にそのUdonBehaviourの「オーナー」だけなんだ。他のプレイヤーのUdonBehaviourが持ってる同期変数を直接いじろうとすると、このエラーが出ることがあるよ。
- オーナーシップの移譲 (Networking.SetOwner()) を使うか、SendCustomNetworkEvent()でオーナーに変更をお願いするような処理を考えてみて!
- [<UdonBehaviourName>] OnDeserialization で同期変数の値がおかしい、または更新されない。 (エラーメッセージではないが、よくある問題)
- ヒロの解説!: 「あれ?同期したはずなのに値が変わってないぞ?」
- こんな時のヒント!:
- OnDeserialization()は、同期変数がネットワーク経由で送られてきて、自分のローカルの値が更新された「後」に呼ばれるコールバックだよ。
- この中で同期変数の値をさらに変更しようとすると、意図しない動作になることがあるから注意!
- 同期変数がちゃんと更新されているか、デバッグログ (Debug.Log()) を仕込んで確認してみよう。あと、同期の頻度(LinearとかSmooth)の設定も影響することがあるよ。
【イベント送受信 (Events) 関連】
- UdonSharp.Compiler.UdonSharpCompilerException: SendCustomEvent target … is not an UdonBehaviour.
- 日本語にすると…: 「SendCustomEventでイベントを送ろうとしてる相手、UdonBehaviourじゃないみたいだよ!」
- こんな時のヒント!:
- SendCustomEvent()の最初の引数には、イベントを受け取るUdonBehaviourコンポーネントを指定しないといけないんだ。GameObjectを指定しちゃってたりしてないかな?
- GetComponent<UdonBehaviour>()でちゃんとUdonBehaviourを取得できてるか確認してみて!
- [<UdonBehaviourName>] Sent custom event ‘<EventName>’ to behavior without the event defined.
- 日本語にすると…: 「イベント'<EventName>’を送ったけど、相手のUdonBehaviourにそのイベント名のメソッドがないみたい…」
- こんな時のヒント!:
- SendCustomEvent(“MyAwesomeEvent”)みたいにイベントを送ったのに、受け取る側のUdonSharpスクリプトにpublic void MyAwesomeEvent()っていう名前のメソッドがないと、この警告が出るよ。
- イベント名(メソッド名)のスペルミスがないか、大文字・小文字も合ってるか、よーく確認してね!
- SendCustomNetworkEvent が期待通りに動作しない。 (エラーメッセージではないが、よくある問題)
- ヒロの解説!: 「ネットワークイベント送ったのに、他の人に届いてないぞ!?」
- こんな時のヒント!:
- SendCustomNetworkEvent()は、ネットワーク経由で他のプレイヤーのUdonBehaviourにイベントを送る機能だよ。
- まず、対象のUdonBehaviourがちゃんと同期オブジェクト(VRC Object Syncとかが付いてる)である必要があるよ。
- 送るイベントの種類(VRC.Udon.Common.Interfaces.NetworkEventTargetで指定するやつ)も大事!Allなら全員、Ownerならオーナーだけ、Othersならオーナー以外、みたいにね。
- あと、イベントを受け取る側のUdonBehaviourに、対応する名前のpublicメソッドがあるかも確認してね!
【Unity API との連携・制限関連】
- UdonSharp.Compiler.UdonSharpCompilerException: Cannot access static field … on type … directly. UdonBehaviours cannot read static C# fields directly.
- 日本語にすると…: 「そのクラスの静的フィールド(みんなで共有してる変数)に直接アクセスはできないんだ。ごめんね!」
- こんな時のヒント!:
- UdonSharpから、C#のstaticな変数に直接アクセスするのは基本的にできないんだ(一部例外あり)。
- もしどうしても使いたいなら、そのstatic変数の値を返すpublic staticなメソッドをC#側で作って、UdonSharpからはそのメソッドを呼ぶ、みたいな工夫が必要だよ。
- UdonSharp.Compiler.UdonSharpCompilerException: Type … is not exposed to Udon.
- 日本語にすると…: 「’Type’っていう種類のものは、Udonの世界では使えないんだ。」
- こんな時のヒント!:
- UdonSharpで使えるUnityの型や、C#の型には制限があるよ。例えば、List<T>とかDictionary<TKey, TValue>みたいなジェネリックコレクションは直接使えないことが多いんだ(配列は使えるよ!)。
- 使える型の一覧は、VRChatのドキュメントで確認してみてね。代替手段を考える必要があるかも。
- LINQを使おうとしてエラーが出る。 (例: …does not contain a definition for ‘Select’ )
- 日本語にすると…: 「あれ?配列とかでよく使う便利なあの機能(LINQ)、UdonSharpでは使えないの!?」
- こんな時のヒント!:
- 残念ながら、UdonSharpではLINQ(.Where()とか.Select()とか、配列やコレクションをカッコよく操作するアレね!)は基本的にサポートされてないんだ。
- 地道にforループとかforeachループを使って、同じような処理を書く必要があるよ。ちょっと手間だけど、頑張ろう!
- GetComponentInChildren<T>() や GetComponentsInParent<T>() が期待通りに動作しない、またはエラー。
- ヒロの解説!: 「子オブジェクトや親オブジェクトから部品を探してるのに、見つからないかエラーになっちゃう…」
- こんな時のヒント!:
- UdonSharpでもこれらのメソッドは使えるけど、パフォーマンスの観点から、あまり頻繁に呼ぶのはおすすめできないかも。
- 特に、対象のオブジェクトが非アクティブ (SetActive(false)) だと、GetComponentInChildren<T>(true)みたいにincludeInactiveをtrueにしないと見つからないから注意だよ。
- エラーになる場合は、型TがUdonで使えるものか、探してるオブジェクトの階層が本当に正しいか、もう一度確認してみてね。
- コルーチン (StartCoroutine) がUdonSharpで使えない、または動作が異なる。
- ヒロの解説!: 「C#みたいにコルーチンで待機処理したいんだけど、Udonだとどうやるの?」
- こんな時のヒント!:
- UdonSharpでは、C#のyield return new WaitForSeconds()みたいなコルーチンの書き方は直接サポートされてないんだ。
- 代わりに、SendCustomEventDelayedSeconds()とかSendCustomEventDelayedFrames()を使って、指定時間後や指定フレーム後に別のイベント(メソッド)を呼び出す、っていう方法で似たようなことができるよ。
- UnityEngine.Random の一部メソッドが使えない。
- ヒロの解説!: 「ランダムな値が欲しいんだけど、いつものあのメソッドが使えない…!」
- こんな時のヒント!:
- UdonSharpでは、UnityEngine.Randomクラスの全てのメソッドが使えるわけじゃないんだ。例えば、Random.Range(int, int)のオーバーロード(同じ名前で引数が違うやつ)の一部とかね。
- 使えるメソッドをドキュメントで確認して、もし使えないなら、floatで取得してからintに変換する、みたいな工夫が必要になるかも。
【VRChat特有の機能関連】
- VRCPlayerApi.isLocal の使いどころを間違えて、意図しない動作になる。
- ヒロの解説!: 「この処理、自分だけに実行させたいのに、他の人にも影響しちゃってる!?」
- こんな時のヒント!:
- player.isLocalは、そのVRCPlayerApiのインスタンスがローカルプレイヤー(つまり、そのUdonBehaviourを実行している自分自身)のものかどうかを判定するのに使うよ。
- 「このボタンを押せるのは自分だけ」みたいな処理を書くときに超重要! if (Networking.LocalPlayer.isLocal) みたいな感じで、ローカルプレイヤー自身に対する処理なのか、特定のプレイヤーに対する処理なのかをしっかり区別しようね。…おっと、Networking.LocalPlayerは常にローカルプレイヤーだから、isLocalは常にtrueだね!特定のプレイヤーplayerに対してif (player.isLocal)って使うのが正しいよ!
- Networking.LocalPlayer と VRCPlayerApi の変数を混同してしまう。
- ヒロの解説!: 「あれ?このプレイヤーって自分?それとも他の誰か?」
- こんな時のヒント!:
- Networking.LocalPlayerは、常にそのUdonを実行しているローカルプレイヤーのVRCPlayerApiを返すよ。
- 一方で、OnPlayerJoined(VRCPlayerApi player)みたいにイベントの引数で渡ってくるplayerは、そのイベントを引き起こした特定のプレイヤー(自分かもしれないし、他の人かもしれない)を指すんだ。
- 誰に対する処理なのか、しっかり意識して使い分けようね!
- VRCStation の使用方法や、座った時の処理が難しい。
- ヒロの解説!: 「椅子に座らせたいんだけど、なんだかうまくいかない…」
- こんな時のヒント!:
- プレイヤーを椅子とかに座らせるには、VRCStationコンポーネントを使うよ。
- スクリプトから座らせるには、対象のプレイヤーのVRCPlayerApiに対して、UseStation()メソッドを呼んであげるんだ。
- 座った時や立った時に何か処理をしたいなら、VRCStationのOnStationEnteredとOnStationExitedっていうイベントが使えるUdonBehaviourを、VRCStationと同じオブジェクトにアタッチして、そこでイベントを受け取るように設定するといいよ。
- VRC_Pickup で物を持った時の処理や、同期が複雑。
- ヒロの解説!: 「このアイテム、みんなで持てるようにしたいんだけど、同期がぐちゃぐちゃに…!」
- こんな時のヒント!:
- VRC_Pickupコンポーネントを使うと、物を持てるようになるよ。
- 持った時 (OnPickup) や離した時 (OnDrop) に何か処理をしたいなら、対応するイベントが使えるUdonBehaviourをアタッチしよう。
- 物を同期させたい場合は、VRC Object Syncコンポーネントも一緒にアタッチする必要があるよ。誰が持ってるか (IsHeld) とかの情報も同期されるんだ。オーナーシップの管理も重要になってくるから、ちょっと複雑だけど頑張って!
- SetGameObjectActive() の同期が取れない。
- ヒロの解説!: 「オブジェクトを非表示にしたはずなのに、他の人には見えちゃってる!」
- こんな時のヒント!:
- gameObject.SetActive(false)みたいにオブジェクトのアクティブ状態を変えても、その変更はローカル(自分だけ)にしか反映されないんだ。
- 他のプレイヤーにも同じように表示・非表示を同期させたい場合は、同期変数(例えばbool型)を用意して、その変数の値が変わったら各プレイヤーがローカルでSetActive()を呼ぶ、みたいな仕組みを作る必要があるよ。もしくは、SendCustomNetworkEvent()でみんなに変更を伝えるとかね!
【その他・よくある落とし穴】
- UdonSharpスクリプトのファイル名とクラス名が一致していない。
- 日本語にすると…: 「スクリプトのファイルの名前と、中のクラスの名前、違うみたいだよ!」
- こんな時のヒント!:
- UdonSharp(というかC#全般だけど)では、スクリプトのファイル名(例: MyScript.cs)と、そのスクリプトの中に書かれているクラス名(例: public class MyScript : UdonSharpBehaviour)は、大文字・小文字も含めて完全に一致してないといけないんだ。
- これがズレてると、コンパイルエラーになったり、Unityエディタでうまく認識されなかったりするから気をつけてね!
- Public変数がインスペクターに表示されない。
- ヒロの解説!: 「publicにしたのに、Unityエディタのインスペクターに出てこないぞ!?」
- こんな時のヒント!:
- まず、スクリプトにコンパイルエラーが残ってないか確認しよう!エラーがあると、インスペクターが正しく更新されないことがあるんだ。
- それでもダメなら、UdonSharpでインスペクターに表示できる型に制限がある可能性も考えてみて。すごく複雑な自作クラスとかは、そのままじゃ表示できないことがあるよ。
- あとは、[HideInInspector]っていう属性をうっかり付けちゃってないかも確認してみてね!
- Update() や FixedUpdate() が呼ばれすぎ、または呼ばれない。
- ヒロの解説!: 「毎フレーム実行されるはずの処理が、全然動いてないか、逆に動きすぎてる!?」
- こんな時のヒント!:
- Update()は毎フレーム呼ばれるけど、UdonBehaviourがアタッチされてるGameObjectがアクティブ (SetActive(true)) で、かつUdonBehaviour自身も有効 (enabled = true) になってないとダメだよ。
- 処理が重すぎると、フレームレートが落ちてUpdate()の呼ばれる間隔が長くなっちゃうこともあるから注意!
- 呼ばれすぎてるように感じる場合は、本当に毎フレーム実行する必要がある処理なのか、もう一度考えてみてね。条件分岐で頻度を調整するのも手だよ。
- transform.position を直接書き換えているのに、他のプレイヤーと同期しない。
- ヒロの解説!: 「オブジェクト動かしたのに、友達の画面では元の場所のまま!?」
- こんな時のヒント!:
- オブジェクトの位置を同期させるには、VRC Object Syncコンポーネントをそのオブジェクトにアタッチする必要があるんだ。
- transform.position = newPosition;みたいに直接位置を変えても、それはローカルでの変更になっちゃう。VRC Object Syncが付いていれば、オーナーが動かした情報が他のプレイヤーに送られるよ。
- もしオーナーじゃない人が動かしたい場合は、オーナーシップを要求 (Networking.SetOwner()) するか、ネットワークイベントでオーナーに移動をお願いする必要があるんだ。
- デバッグログ (Debug.Log()) がVRChatクライアントのログに出ない。
- ヒロの解説!: 「Unityエディタではログ出てたのに、VRChatにアップしたらログが見れない!」
- こんな時のヒント!:
- VRChatクライアントでUdonのログを見るには、起動オプションでログ出力を有効にする必要があるんだ。
- VRChatの起動ショートカットのプロパティを開いて、リンク先の末尾に –enable-udon-debug-logging って追加してみて!(ハイフン2つだよ!)
- これで、ドキュメントフォルダのVRChatのログファイルに、UdonのDebug.Log()の内容も記録されるようになるはず!
- UdonSharpのバージョンとVRChat SDKのバージョンが合っていない。
- ヒロの解説!: 「なんだかよく分からないエラーがいっぱい出る…もしかして…?」
- こんな時のヒント!:
- UdonSharpもVRChat SDKも、日々アップデートされて進化してるんだ。だから、使ってるUdonSharpのバージョンと、プロジェクトに入ってるVRChat SDKのバージョンが、ちゃんと互換性のある組み合わせになってるか確認してみてね。
- VRChat Creator Companion (VCC) を使っていれば、この辺のバージョン管理はだいぶ楽になるよ!
- 単純なタイプミスや構文エラー。 (括弧の閉じ忘れ、セミコロン忘れなど)
- 日本語にすると…: 「あちゃー!うっかりミス発見!」
- こんな時のヒント!:
- どんなに慣れてる人でもやっちゃうのが、こういう基本的なミス!括弧 {} や () の数が合わなかったり、行の最後にセミコロン ; を忘れちゃったり…。
- エラーメッセージが「予期しないシンボルが見つかりました」とか「セミコロンが必要です」みたいに直接教えてくれることも多いから、落ち着いてエラーメッセージを読んでみてね!
はい、承知いたしました!Unity(特にVRChatワールド制作やUdonSharpに関連する可能性のあるものを含む)で遭遇する可能性のあるエラーメッセージや警告、一般的な問題点を150個リストアップし、ヒロの口調でブログ記事形式でご紹介しますね。
150個となるとかなりのボリュームになりますので、一つ一つの解説は簡潔に、そして原因特定のヒントやキーワードを中心にまとめていきます。この記事が、広範囲なエラーへの対応力を養うための一助となれば幸いです!
【Unityエラー大辞典!?】ヒロと学ぶ!エラー&警告150連発!原因と対策のヒント集!
やっほー!みんなのUnityデバッグ応援団長、ヒロだよ!
UnityでゲームやVRChatワールドを作っていると、もう本当にいろんなエラーメッセージや警告に出会うよね!「また赤い文字だー!」「今度は黄色いのが出たぞ!?」って、コンソール画面とにらめっこする時間も少なくないはず。
でもね、エラーは敵じゃない!むしろ、キミの作品をもっと良くするための、Unityからの大切なアドバイスなんだ。
今日は、ヒロがこれまでに遭遇したり、よく耳にしたりするUnityのエラーや警告、そして「あれ?おかしいな?」となりがちな問題点を、どどーんと150個集めてみたよ!もちろん、VRChatワールド制作やUdonSharpに関連しそうなものもいっぱい入れておいたからね!
全部を一度に覚える必要はないけど、「こんなエラーもあるんだな~」って知っておくだけでも、いざという時にきっと役立つはず!さあ、ヒロと一緒にエラー解決の引き出しを増やしちゃおう!
Unityエラー&警告150連発!これでキミもデバッグマスター!?
ここでは、エラーメッセージの原文(またはそれに近い表現)と、ヒロからのワンポイントアドバイスを載せていくよ!困った時の参考にしてね!
【コンパイルエラー (CSシリーズなど) – スクリプトの文法や参照の問題】
- CS0103: The name ‘X’ does not exist in the current context. (Xが見つからないよ!)
- スペルミス、宣言忘れ、スコープ外かも?
- CS0246: The type or namespace name ‘X’ could not be found. (Xっていう型や名前空間、知らないなぁ。)
- using宣言忘れ?アセンブリ参照不足?スペルミス?
- CS1061: ‘Type’ does not contain a definition for ‘X’. (Typeちゃん、Xっていう技持ってないよ。)
- メソッドやプロパティのスペルミス?そのクラスに本当にその機能ある?
- CS0165: Use of unassigned local variable ‘X’. (Xくん、まだ空っぽなのに使おうとしてる!)
- ローカル変数、使う前に値を入れてあげてね。
- CS0029: Cannot implicitly convert type ‘A’ to ‘B’. (AをそのままBの箱には入れられないよ。)
- 型変換(キャスト)が必要かも?そもそも型が違う?
- CS0117: ‘Type’ does not contain a definition for ‘X’. (静的メンバーの場合) (Typeちゃん、みんなで使えるXっていう道具、持ってないよ。)
- 静的メンバーのスペルミス?本当にそのクラスにある?
- CS0019: Operator ‘X’ cannot be applied to operands of type ‘A’ and ‘B’. (AとBに、Xっていう計算はできないよ。)
- 計算しようとしてるものの型、合ってる?
- CS1501: No overload for method ‘X’ takes ‘Y’ arguments. (Xっていう技、Y個の引数で使えるやつないよ。)
- メソッドに渡してる引数の数、合ってる?
- CS1503: Argument ‘N’: cannot convert from ‘A’ to ‘B’. (N番目の引数、AじゃなくてBを入れてほしいな。)
- メソッドに渡してる引数の型、合ってる?
- CS0120: An object reference is required for the non-static field, method, or property ‘X’. (Xはインスタンスがないと使えないよ。)
- staticじゃないメンバーは、クラスのインスタンスを作ってから使おうね。
- CS0234: The type or namespace name ‘X’ does not exist in the namespace ‘Y’. (Yっていう名前空間の中に、Xは見当たらないなぁ。)
- using宣言、足りてる?名前空間の指定、合ってる?
- CS0104: ‘X’ is an ambiguous reference between ‘A’ and ‘B’. (Xって言われても、AとBどっちのことか分からないよ~。)
- 同じ名前のものが複数あるみたい。フルネームで指定するか、usingで区別しよう。
- CS0161: ‘Method’: not all code paths return a value. (Methodくん、どんな時でも値を返してくれないと困るなぁ。)
- 値を返すメソッドなのに、値を返さないルートがあるみたい。
- CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement. (この行、なんだか中途半端だよ。代入とかメソッド呼び出しとかにしてね。)
- 式の途中で終わっちゃってるかも。セミコロン;忘れ?
- CS1002: ; expected. (セミコロン;がないよー!)
- 行の最後にセミコロン、忘れてない?
- CS1026: ) expected. / CS1003: Syntax error, ‘}’ expected. (閉じ括弧)か}がないよ!)
- 括弧の数、合ってるかな?
- CS0118: ‘X’ is a namespace but is used like a type. (Xは名前空間なのに、型みたいに使おうとしてるよ。)
- 名前空間とクラス名、混同してない?
- CS0433: The type ‘X’ exists in both ‘A.dll’ and ‘B.dll’. (Xっていう同じ設計図が、AとBどっちの部品箱にも入ってる!)
- どっちかの部品箱を整理する必要があるかも。
- CS0108: ‘member1’ hides inherited member ‘member2’. Use the new keyword if hiding was intended. (member1が親から受け継いだmember2を隠しちゃってるよ。わざと?)
- 意図して上書きしてるならnewを、そうでないなら名前を変えよう。
- CS0115: ‘function’ : no suitable method found to override. (functionをオーバーライドしようとしてるけど、親にそんなメソッドないよ。)
- overrideするメソッド名や引数、合ってる?親クラスにvirtualって付いてる?
【NullReferenceException とその仲間たち – オブジェクトが見つからない系】
- NullReferenceException: Object reference not set to an instance of an object. (参照しようとしてるもの、まだ何にも入ってない箱みたい!)
- 変数に値が入ってない、アタッチ忘れ、GetComponent失敗など。
- UnassignedReferenceException: The variable X of Y has not been assigned. (Yの中のXくん、まだ誰とも繋がってないよー!)
- インスペクターでのアタッチ忘れがほとんど。
- MissingComponentException: There is no ‘X’ attached to the ‘Y’ game object. (YくんにXっていう部品、付いてないみたいだけど?)
- GetComponentで探してる部品、本当に付いてる?
- GameObject has been destroyed but you are still trying to access it. (そのゲームオブジェクト、もう壊しちゃった後なのに!)
- Destroy()したオブジェクトにアクセスしようとしてる。nullチェックを。
- The referenced script (Unknown) on this Behaviour is missing! (この部品にくっついてるはずの設計図、迷子になっちゃった!)
- スクリプトファイル削除、名前変更が原因。再アタッチかコンポーネント削除を。
【配列・リスト関連のエラー – 範囲外アクセスなど】
- IndexOutOfRangeException: Index was outside the bounds of the array. (配列の箱、そんな番号のところにはないよ!)
- ループの条件、配列の長さを確認。
- ArgumentOutOfRangeException: Index was out of range. (引数の値、範囲外だよ!)
- リストとかで、ありえないインデックスを指定してるかも。
【UdonSharp特有のエラー・警告 – VRChatワールド制作向け】
- UdonSharp.Compiler.NotUserProvidedException: The C# field … is not exposed to Udon. (そのC#の変数、Udonの世界では使えないよ!)
- Udonで使える型か、publicになってるか確認。
- UdonSharp.Compiler.UdonSharpCompilerException: Method … cannot be exposed to Udon. (そのメソッド、Udonの世界には持っていけないよ。)
- インスタンスメソッドかC#のstaticメソッドに。
- UdonSharp.Compiler.UdonSharpCompilerException: Synced variables cannot be of type ‘X’. (同期変数にXっていう種類は使えないんだ。)
- 同期できる型は限られてるよ。基本的な型を使おう。
- UdonSharp.Compiler.UdonSharpCompilerException: Synced variable … is not public. (同期変数くん、publicじゃないとダメだよ!)
- 同期変数は必ずpublicで。
- UdonSharp.Compiler.UdonSharpCompilerException: Cannot set synced variable … directly from an UdonSharpBehaviour that does not own it. (その同期変数、キミの持ち物じゃないから直接書き換えられないよ!)
- オーナーシップを確認。変更はオーナーだけ。
- [<UdonBehaviourName>] Sent custom event ‘<EventName>’ to behavior without the event defined. (イベント送ったけど、相手にそのイベント名のメソッドがないよ。)
- イベント名(メソッド名)のスペルミス、大文字小文字を確認。
- UdonSharpスクリプトのファイル名とクラス名が不一致。 (スクリプトのファイルの名前と、中のクラスの名前、違うみたい!)
- 完全に一致させてね(大文字小文字も!)。
- SendCustomNetworkEvent が期待通りに動作しない。 (ネットワークイベント送ったのに、他の人に届いてないぞ!?)
- 対象は同期オブジェクト?イベントの種類は適切?受け側にpublicメソッドある?
- VRCPlayerApi.isLocal の使いどころを間違えている。 (この処理、自分だけに実行させたいのに!)
- Networking.LocalPlayerは常にローカル。if (player.isLocal)で特定プレイヤーか判断。
- SetGameObjectActive() の同期が取れない。 (オブジェクト非表示にしたのに、他の人には見えてる!)
- ローカル処理だよ。同期変数かネットワークイベントで同期しよう。
- UdonSharpのバージョンとVRChat SDKのバージョン不整合。 (なんだかよく分からないエラーがいっぱい…)
- VCCで推奨バージョンになってるか確認。
- [UdonSynced] を付け忘れている、または不要なものに付けている。 (これ、同期するんだったっけ?しなくていいやつ?)
- 同期が必要な変数には忘れずに。不要なものに付けると無駄な負荷に。
- UdonBehaviourのPublic変数がインスペクターでうまく設定できない。 (あれ?インスペクターでいじれないぞ?)
- 型が複雑すぎない?コンパイルエラー残ってない?
- VRC Object Sync の設定がおかしい、または付け忘れ。 (物の位置が同期しないよ~!)
- 同期させたいオブジェクトには必須だよ。
- Networking.SetOwner() の呼び出しタイミングや条件が不適切。 (オーナー変更がうまくいかない!)
- 誰でも彼でもオーナーになれるわけじゃないよ。呼び出し条件を確認。
- UdonからUnityのstaticな変数やメソッドに直接アクセスしようとしている。 (みんなで使えるあの道具、Udonから直接は取れないの?)
- 基本的にはNG。ラッパーメソッドを作るなどの工夫を。
- LINQを使おうとしてエラー。 (便利なアレ、UdonSharpでは使えないの!?)
- 残念ながら基本NG。地道にループ処理で。
- コルーチンが使えない、または SendCustomEventDelayedSeconds の使い方が難しい。 (ちょっと待ってから処理したいんだけど…)
- Udon流の遅延実行をマスターしよう。
【Unityエディタ・ビルド・アップロード関連のエラー】
- Error building Player: Exception: No scenes in build. (ビルドするシーンが何も選ばれてないよ!)
- Build Settingsにシーンを追加&チェック。
- You are not logged in. Please log in to the VRChat SDK to upload content. (VRChat SDKにログインしてないみたい!)
- SDKコントロールパネルでログイン確認。
- This account is not allowed to publish content. (このアカウント、公開権限ないみたい…)
- トラストレベルを確認。New User以上が必要。
- Failed to upload Blueprint. Error: … (ブループリントのアップロード失敗!)
- Blueprint IDの設定を確認。重複やエラー内容をチェック。
- World size is too large. Maximum allowed size is … MB. (ワールドのファイルサイズが大きすぎるよ!)
- テクスチャ圧縮、不要アセット削除で軽量化。
- パフォーマンス制限超過 (Performance Blocked Uploadなど)。 (ワールドが重すぎてアップロードできない!)
- ポリゴン数、マテリアル数などSDKで確認し最適化。
- プロジェクトパスに日本語や特殊文字。 (プロジェクトの場所の名前、変な文字入ってない?)
- 半角英数字推奨。
- ビルドターゲット(プラットフォーム)設定ミス。 (これ、PC用?Quest用?どっちだっけ?)
- SDKコントロールパネルで正しいプラットフォームを選んでね。
- All compiler errors have to be fixed before you can enter playmode! (プレイモード入る前に、赤いエラー全部直してね!)
- まずはコンパイルエラーをゼロに。
- UnityエディタやSDKのキャッシュ破損。 (なんだかUnityの調子がおかしい…)
- 再起動、Libraryフォルダ再構築を試してみて。
- Failed to pack … into an asset bundle. (アセットバンドルにまとめるの、失敗しちゃった。)
- ファイルパス、ファイル破損、Unityバージョン互換性など確認。
- Could not produce class data for … (UdonSharpのコンパイル時) (クラスの情報をうまく作れなかったみたい。)
- スクリプトに複雑な構造やUdonで未対応の記述がないか確認。
- ディスクの空き容量不足でビルド失敗。 (PCのHDD/SSD、もうパンパンじゃない?)
- 空き容量を確保しよう。
- アンチウイルスソフトによるビルドプロセス妨害。 (セキュリティソフトが邪魔してるかも?)
- 一時的に無効化してみる(自己責任で!)。
- 古いビルドデータが残っていて悪さをしている。 (前のビルドのゴミが残ってる?)
- クリーンビルドを試すか、出力先フォルダを一度空にしてみて。
【実行時エラー (Runtime Errors) – ゲーム実行中に発生】
- ArgumentNullException: Value cannot be null. (引数にnullはダメだって言ったでしょ!)
- メソッドに渡す変数がnullになってないか確認。
- DivideByZeroException: Attempted to divide by zero. (ゼロで割っちゃダメー!)
- 割り算する時、割る数がゼロになってないかチェック。
- FormatException: Input string was not in a correct format. (文字列の形、なんかおかしいよ。)
- 数値を文字列から変換する時とかに、文字列がちゃんと数値の形になってるか確認。
- KeyNotFoundException: The given key ‘X’ was not present in the dictionary. (辞書にXっていうキー、見当たらないよ。)
- Dictionaryから値を取ろうとして、キーが存在しない場合。
- StackOverflowException (お願いの処理が積み重なりすぎてパンクしちゃった!)
- 無限再帰呼び出し、深すぎる呼び出し階層を確認。
- OutOfMemoryException (メモリがもういっぱいで何も覚えられないよ!)
- 大きなデータ扱いすぎ?メモリリーク?プロファイラで調査。
- TargetException: Object does not match target type. (お願いする相手、間違ってるみたい。)
- リフレクションとかで、型が一致しないオブジェクトに操作しようとしてるかも。
- InvalidCastException: Specified cast is not valid. (その型変換、無理だよ~。)
- 互換性のない型同士で無理やりキャストしようとしてる。
- ArithmeticException: Overflow or underflow in the arithmetic operation. (計算結果が、表現できる範囲を超えちゃった!)
- 計算結果が大きすぎたり小さすぎたりしてないか確認。
- コルーチン内で yield return null しかしていないのに重い。 (待ってるだけなのに、なんで重いの?)
- 毎フレーム何か重い処理をしてるか、コルーチンがたくさん動きすぎてるかも。
- Time.deltaTime が非常に大きくなったり小さくなったりする。 (時間の進み方がおかしいぞ?)
- フレームレートが極端に不安定だと起こる。重い処理を見直そう。
- オブジェクトが予期せず消える、または表示がおかしい。 (あれ?あの子どこ行った?なんか見た目も変だぞ?)
- SetActive(false)しちゃった?マテリアルやシェーダーの設定ミス?
- 物理演算が暴れる、オブジェクトがすり抜ける。 (うわー!物が飛んでったー!壁抜けちゃったー!)
- コライダーの設定、Rigidbodyの設定、FixedUpdateでの処理を確認。
- アニメーションが再生されない、または途中で止まる。 (アニメーション動かないよー!)
- Animatorコントローラーの設定、遷移条件、スクリプトからの制御を確認。
- 音声が再生されない、またはおかしい。 (音がでない!変な音!ループしない!)
- AudioSourceの設定、AudioClipのアタッチ、スクリプトからの制御を確認。
- UI要素がクリックできない、または反応しない。 (ボタン押せないんだけど!)
- Raycaster付いてる?EventSystemある?他のUIに隠れてない?
- Input.GetKey や Input.GetButton が反応しない。 (キー入力が効かないよ!)
- Input Managerの設定、スクリプトの処理タイミング(Update内か?)を確認。
- シーン遷移がうまくいかない。 (次のステージに行けない!)
- シーン名合ってる?Build Settingsに入ってる?
- セーブ・ロード機能が正しく動作しない。 (セーブしたはずなのにデータがない!)
- 保存パス、ファイル形式、データのシリアライズ・デシリアライズ処理を確認。
- DontDestroyOnLoad を使ったオブジェクトが重複して生成される。 (同じものがどんどん増えていくー!)
- 最初に生成する時に、既に存在しないかチェックする処理を入れよう。
【警告 (Warnings) – 黄色いメッセージ、エラーじゃないけど注意!】
- The variable ‘X’ is assigned but its value is never used. (Xくんに値を入れたけど、一度も使ってないみたいだよ?)
- 不要な変数かも。消し忘れ?
- ‘X’ is obsolete: ‘Y’. (Xはもう古いから、代わりにYを使ってね!)
- Unityが推奨する新しい方法に置き換えよう。
- There are X unused private fields. (使ってないプライベートな変数がX個あるよ。)
- コードのお掃除タイム!
- GetComponent should not be called in Update a lot. (Updateの中でGetComponent呼びすぎ!重くなるよ!)
- StartとかAwakeで最初に取得して変数に保存しておこう。
- Material ‘X’ is not compatible with the current Render Pipeline. (マテリアルX、今のレンダーパイプラインと合わないみたい。)
- URPやHDRPを使ってるなら、対応したマテリアルに変換しよう。
- The AnimationClip ‘X’ has an invalid wrap mode ‘Once’. It has been reset to ‘Default’. (アニメーションXのループ設定、ちょっとおかしかったから直しといたよ。)
- 意図したループ設定になってるか確認。
- Screen position out of view frustum. (そのオブジェクト、カメラから見えないところにいるみたいだよ。)
- 意図してないなら位置調整。
- Shader wants tangents, but the mesh ‘X’ doesn’t have them. (シェーダーがタンジェント情報を欲しがってるけど、メッシュXにないよ。)
- モデルインポート設定でタンジェントを計算するようにするか、シェーダーを変えよう。
- Texture ‘X’ is not power of two (POT). (テクスチャXのサイズ、2のべき乗じゃないよ。一部環境で問題出るかも。)
- テクスチャサイズを512×512とか1024×1024みたいにしよう。
- Audio Clip ‘X’ is using an old compression format. (オーディオX、古い圧縮形式だよ。新しいのに変換できるよ。)
- インポート設定で新しい形式に。
- The referenced script on this Behaviour is missing! (警告の場合) (この部品にくっついてるはずの設計図、ないみたいだけど大丈夫?)
- エラーじゃなくても、後で問題になるかも。確認しよう。
- Instantiating a non-readable ‘X’ texture. This will be slow. (読み取り不可のテクスチャXをコピーしてる。遅くなるよ。)
- テクスチャのインポート設定で「Read/Write Enabled」をオンにするか、コピーしない方法を。
- Assigning temporary RenderTexture to a Material. This may leak memory. (一時的なレンダーテクスチャをマテリアルに割り当ててる。メモリリークするかも。)
- 使い終わったらちゃんと解放(Release)しよう。
- BoxColliders does not support negative scale or size. (BoxColliderの大きさやスケール、マイナスはダメだよ。)
- 正の値にしよう。
- A Default Execution Order script has a lower order than other scripts. This is fine but may not be what you want. (スクリプトの実行順序、ちょっと変わった設定になってるけど、これでいい?)
- Script Execution Orderの設定を確認。
- Lightmap parameters are not valid. Please check the lightmap parameters asset. (ライトマップのパラメータがおかしいよ)
- Lightingウィンドウでライトマップの設定を見直そう。
- Mesh ‘X’ has too many vertices for the Unity UI system. (UIで使うにはメッシュXの頂点が多すぎるよ)
- UIで使うメッシュはシンプルに。
- Particle System is trying to spawn particles, but its emission module is disabled. (パーティクル出そうとしてるけど、放出設定オフだよ)
- Emissionモジュールを有効に。
- The Sprites-Default material is not an instanced material. (スプライトのデフォルトマテリアル、インスタンス化されてないよ)
- 個別に色とか変えたいなら、マテリアルをコピーして使おう。
- NavMesh Agent’s destination is not on a NavMesh. (NavMeshエージェントの目的地、NavMeshの上にないよ)
* 目的地がベイクされたNavMeshの上にあるか確認。
【VRChat SDK & ワールド設定関連の警告・問題点】
- ワールドにSpawn Pointが設定されていない、または複数設定されている。 (プレイヤーどこに現れるの?)
* VRCWorldオブジェクトにPipeline Managerをアタッチし、シーン内にVRC_Scene Descriptorを配置して、その中のSpawn Locationを設定しよう。 - ワールド内のVRC_MirrorReflectionにカメラが設定されていない。 (鏡が何も映してないぞ?)
* ミラーのコンポーネントに、映すためのカメラをアタッチしよう。 - Quest対応ワールドなのに、PC専用シェーダーやコンポーネントが残っている。 (これ、Questじゃ動かないやつだ!)
* Questでは使えないものは削除するか、Quest用のものに置き換えよう。 - ワールドのライティングがベイクされていない、または古い。 (なんだかワールドが暗い/のっぺりしてる…)
* Lightingウィンドウでライトをベイクしよう。 - トリガーやボタンの設定が Local になっているのに、グローバルな動作を期待している。 (このボタン、自分にしか効かない設定だよ?)
* 他のプレイヤーにも影響させたいなら、同期処理やネットワークイベントが必要。 - AudioSourceのSpatial Blendが2Dのままなのに、3D的な聞こえ方を期待している。 (音がどこからともなく聞こえる…)
* 音の発生源から聞こえるようにしたいならSpatial Blendを3Dに。 - Post Processingの設定が重すぎる、またはQuestで非対応のものを使用している。 (画面はキレイだけど、めちゃくちゃ重い!Questだと真っ暗!)
* Post Processingは負荷が高い。Questでは使えるエフェクトも限られるよ。 - ワールドにDirectional Lightが複数存在する。 (太陽が2つある!?)
* 基本的には1つで。意図しない影や明るさになるかも。 - MirrorのReflect Layersの設定が適切でない。 (鏡にアバターが映らない/余計なものまで映る!)
* ミラーに映したいレイヤーだけを選択しよう。 - VRC_Pickupの同期設定 (Allow Ownership Transferなど) が意図通りでない。 (物を持てない/他の人が持ってる物を取れない!)
* 誰が持てるようにするか、同期をどうするか、設定を確認。 - UdonGraphでノードが繋がっていない、またはロジックがおかしい。 (UdonGraph、途中で線が切れてるよ!)
* 意図した通りにノードが繋がっているか、処理の流れを確認。 - Spawn地点がコライダーの中や壁際で、プレイヤーがスタックする。 (ワールド入ったらいきなり壁の中!?)
* スポーン地点の周りに十分なスペースがあるか確認。 - シーン内にアクティブなカメラが複数あり、意図しないカメラが使われる。 (なんか視点が変だぞ?)
* メインで使うカメラのTagをMainCameraに。不要なカメラは無効化。 - テクスチャのMipmap設定がオフになっている、または不適切。 (遠くのものがギザギザしてる…)
* Mipmapを有効にすると、遠くのテクスチャがキレイに見えるよ。 - アニメーションコントローラーの遷移条件が複雑すぎたり、ループしたりしている。 (アニメーションが変な動きする/止まらない!)
* 遷移条件を見直して、意図した通りに動くか確認。 - ワールドのBounds(境界)が非常に大きい、または不適切。 (ワールドの広さ、これで合ってる?)
* VRC_Scene DescriptorのBounds設定が、ワールドの実際の大きさと合っているか確認。 - Avatar Pedestalに設定されているBlueprint IDが無効、またはアバターが非公開。 (アバターペデスタル使えないんだけど!)
* IDが正しいか、アバターがPublicでアップロードされているか確認。 - ワールド内のCanvasのRender ModeがScreen Space – Overlayなのに、ワールド内オブジェクトとして扱いたい。 (UIが常に一番手前にきちゃう!)
* ワールド内のオブジェクトとしてUIを配置したいなら、Render ModeをWorld Spaceに。 - Occlusion Cullingがベイクされていない、または設定が不適切。 (見えないところも描画してて重い!)
* Occlusion Cullingを使うと、カメラから見えないものを描画しなくなるから軽くなるよ。 - ワールド内のコライダーが複雑すぎる、または多すぎる。 (なんだか物理演算がガクガクする…)
* コライダーはできるだけシンプルな形に。メッシュコライダーの使いすぎに注意。
【一般的なUnity操作・設定ミスなど】
- プレハブの変更がシーン内のインスタンスに反映されない。 (プレハブ変えたのに、シーンのやつは古いまま!)
* インスタンス側でオーバーライドしてない?「Apply to Prefab」し忘れてない? - シーンを保存し忘れて、作業内容が消える。 (うわーん!昨日やった作業が全部消えたー!)
* こまめに保存!Ctrl+S (Cmd+S) は友達! - バージョン管理システム(Gitなど)を使っていない、または使い方が間違っている。 (プロジェクト壊しちゃった…バックアップもない…)
* Gitはいいぞ。使い方を覚えよう。 - インスペクターの値を間違えて変更してしまう。 (あれ?なんか数字変わってる!)
* うっかり触っちゃうこと、あるよね。気をつけて。 - アセットストアからインポートしたアセットの使い方が分からない。 (これ、どうやって使うんだ…?)
* ドキュメントを読んだり、サンプルシーンを見たりしよう。 - Unityのレイアウトが崩れて元に戻せない。 (ウィンドウどこ行った!?)
* 右上の「Layout」から「Default」を選べば初期状態に戻せるよ。 - スクリプト名とファイル名が違うせいでコンポーネントとして認識されない。 (スクリプト付けられないんだけど!)
* C#ではファイル名とクラス名を一致させよう。 - オブジェクトのスケールがマイナスになっている。 (なんか裏返ってる!?)
* スケールは基本的に正の値で。 - シーンビューの操作がおぼつかない (カメラ移動、オブジェクト選択など)。 (もっとスムーズに操作したい!)
* ショートカットキーを覚えたり、操作に慣れたりしよう。 - テクスチャのインポート設定で「Alpha Is Transparency」のチェックが意図通りでない。 (透明なはずなのに白くなっちゃう/その逆)
* アルファチャンネルの扱いを確認。 - Rigidbodyを使っているのに transform.position で直接動かそうとしている。 (物理演算がなんか変!)
* Rigidbodyを動かすなら MovePosition や AddForce を使おう。 - レイヤーマスクの使い方が間違っていて、Raycastが当たらない/当たりすぎる。 (レーザーが壁を貫通する/何も検知しない!)
* Raycastでどのレイヤーを対象にするか、正しく設定しよう。 - マテリアルのシェーダープロパティの意味が分からず、見た目が意図通りにならない。 (このスライダー何だろ…?)
* シェーダーのドキュメントを読んだり、いろいろ試したりしてみよう。 - Time.timeScale を変更したまま元に戻し忘れて、ゲーム全体の速度がおかしい。 (スローモーションが解除できない!)
* デバッグで使ったら、ちゃんと1.0fに戻そうね。 - PlayerPrefsで保存したデータが期待通りに読み込めていない。 (セーブデータどこ行った?)
* キーの名前、合ってる?保存するタイミング、読み込むタイミングは適切? - TextMeshProのフォントアセットが正しく生成・設定されていない。 (文字が表示されない/豆腐になる!)
* Font Asset Creatorでちゃんとフォントアセットを作ろう。 - 複数のイベントが同時に同じオブジェクトを操作しようとして競合する。 (オブジェクトがブルブル震えてる!?)
* 処理の順番や条件を見直そう。 - ビルドしたゲームが特定のPC環境でだけ動作しない。 (友達のPCだと動かないって言われた…)
* 最小スペック、OSバージョン、グラフィックドライバなどを確認。 - デバッグ用のオブジェクトやコードを消し忘れてビルドしてしまう。 (あっ!テスト用の文字が画面に出っぱなしだ!)
* リリース前にはちゃんと確認しようね。 - エラーメッセージをよく読まずに、闇雲に修正しようとする。 (とりあえずここを変えてみよう…ダメだ次!)
* エラーメッセージは解決への最大のヒント!落ち着いて読もう。 - シーン内のオブジェクト名が全て「GameObject」のままで、どれがどれだか分からない。 (えっと、このCubeはどこのCubeだっけ…)
* 分かりやすい名前を付けて整理しよう。後々の自分が助かるよ。 - コライダーがIsTriggerのままで、物理的な衝突を期待している。 (あれ?壁のはずなのに通り抜けちゃう…)
* 衝突させたいならIsTriggerのチェックを外そう。 - スクリプト内で public な変数をたくさん作りすぎて、インスペクターがカオス。 (設定項目多すぎ!どれが重要なんだっけ…)
* [Header(“設定項目”)] や [Space] で整理したり、本当にpublicにする必要があるか考えよう。 - Unityのバージョンアップ後、古いプロジェクトを開いたら大量のエラー。 (うわー!全部赤くなっちゃったー!)
* APIの変更があったのかも。リリースノートを読んだり、バックアップから慎重に移行しよう。 - カメラのClipping Planesの設定が不適切で、遠くの物や近すぎる物が見えない。 (なんか急に物が見えなくなったり現れたりする…)
* NearとFarの値を調整してみよう。 - DontDestroyOnLoad したオブジェクトの参照が、シーンをまたぐと失われる。 (次のシーン行ったら、あの子いなくなっちゃった…)
* シングルトンパターンとかで、どこからでもアクセスできるように工夫しよう。 - ライトのIntensityやRangeが極端な値になっていて、真っ白になったり真っ暗になったりする。 (明るすぎ!/暗すぎ!)
* 適切な値に調整しよう。 - テクスチャのFilter ModeやAniso Levelが不適切で、テクスチャがぼやけたりギザギザしたりする。 (なんか絵が汚いなぁ…)
* Filter ModeをBilinearやTrilinearに、Aniso Levelを上げてみよう(負荷とのバランスも考えてね)。 - プロジェクト設定のグラフィックスAPIが、ターゲットプラットフォームと合っていない。 (QuestなのにDirectX選んでた!みたいな)
* Player Settingsで確認しよう。 - そして最後に…諦めちゃうこと! (もう無理だー!ポイッ!)
* これが一番もったいないエラー!休憩したり、誰かに相談したりして、絶対に諦めないで!
エラーは友達!怖がらずに仲良くなろう!
ふぅ~、150個!すごい数だったね!でも、これだけたくさんの「あるある」を知っておけば、次にエラーが出た時も「あ、これヒロが言ってたやつだ!」って、少しは落ち着いて対応できるんじゃないかな?
エラーメッセージは、キミの作品をより良くするための道しるべ。一つ一つ解決していくことで、キミのUnity力も、VRChatワールド制作スキルも、ぐんぐんアップしていくはずだよ!
もし、どうしても分からないエラーにぶつかっちゃったら、一人で悩まないで!VRChatのコミュニティには、たくさんの優しい先輩クリエイターさんたちがいるから、勇気を出して質問してみてね!きっと、親身になって相談に乗ってくれるはずだから。
さあ、エラーを恐れずに、今日も最高の作品作りに向かって、レッツゴー!
ヒロでした!またね~!応援してるよ!
【VRChatワールド制作】「ヨドコロちゃんのタグマーカー」トラブル解決ガイド!エラーかな?と思ったらココをチェック!
やっほー!みんなのVRChatワールド応援団、ヒロだよ!
VRChatのワールドに、プレイヤーごとにカスタマイズできるカッコイイ「タグマーカー」を付けられるアセット、「ヨドコロちゃんのタグマーカー」!とっても便利で楽しい機能だけど、いざ使ってみると「あれ?ボタンが反応しないぞ?」「マーカーが出ない人がいるんだけど…」なんて、ちょっと困っちゃうこともあるかもしれないよね。
でも大丈夫!このページでは、「ヨドコロちゃんのタグマーカー」を使っていて「困った!」となりがちなポイントと、その解決方法を、制作者さんのマニュアルをもとに分かりやすくまとめたよ!
エラーメッセージが出た時や、思った通りに動かない時は、慌てずにここをチェックしてみてね。きっと解決のヒントが見つかるはず!
さあ、一緒にトラブルを乗り越えて、もっと素敵なタグマーカーワールドを作っちゃおう!
「ヨドコロちゃんのタグマーカー」困ったときのチェックリスト!
「あれ?なんだか上手くいかないぞ…」そんな時は、まずここを確認してみてね!
1. ボタンが反応しない…!
- Unityエディタで確認しよう!
- まずはUnity上で実行してみて、Consoleウィンドウにエラーメッセージが出ていないかチェック!
- もし**[Yodo]で始まるエラー**が出ていたら、それはタグマーカーの設定ミスのお知らせだよ。メッセージをよく読んで、指示に従って設定を見直してみてね。
- それ以外のエラーは、他のアセットやスクリプトが原因かもしれないから、そっちを先に解決してからもう一度試してみよう。
- 一部のボタンだけ動かない?
- 「新しいボタン/タグを定義する」の手順(マニュアル参照)を見返して、操作パネルのボタンと、マーカー側のタグオブジェクトの対応(特に数値やイベント名)がちゃんと合っているか、もう一度じーっくり確認してみてね!
2. ボタンと違う内容のタグが付いちゃう!
- 対応関係を再チェック!
- ボタンと表示されるタグは、操作パネルのボタンのOn Click()イベントに設定された文字列(例: Yodo_TagButton_X)と、マーカー側のタグオブジェクトの名前(例: Button (X))の「X」の数値で紐づいているんだ。
- この数値が、ボタンとマーカーでちゃんと一致しているか、よーく確認してみてね。マニュアルの「新しいボタン/タグを定義する」の項目が参考になるよ!
3. マーカーが出ない人がいるんだけど…
- みんなで使える?一部の人だけ?
- 「一部の人だけマーカーが出ない」とか「自分は使えるけどフレンドは使えない」みたいな状況だったら、もしかしたらアセットの不具合の可能性もあるかも。
- そういう時は、制作者のヨドコロちゃんに連絡してみると、調査してくれるかもしれないよ!(連絡先はマニュアルの「クレジット」を見てね)
4. マーカーがLQ Mirror(ロークオリティミラー)に映らない!
- レイヤー設定がカギ!
- タグマーカーはワールド側のオブジェクトだから、初期設定のままだとLQ Mirrorには映らないことがあるんだ。
- ミラーに何を映すかは「レイヤー」で決まるから、マーカーのレイヤーをミラーが映す設定になっているレイヤーに変更すればOK!
- まず、映したいミラーのインスペクターを見て、「Reflect Layers」の設定を確認しよう。チェックが付いているレイヤーが、そのミラーに映るレイヤーだよ。
- 次に、マーカーの親オブジェクト(MarkerRootとか、マーカーのCanvasが付いているオブジェクト)を選択して、インスペクターで「Layer」を、さっき確認したミラーに映るレイヤー(多くの場合Playerレイヤーで大丈夫なはず!)に変更するんだ。
- 「子オブジェクトも同じレイヤーにする?」って聞かれたら、「Yes」を選んでね。
- これで、LQ Mirrorにもマーカーがバッチリ映るようになるはず!
5. Unityエディタ上で実行するとエラーが出る!
- Client Simulatorは有効になってる?
- Unityエディタでタグマーカーの動作をテストしたいときは、VRChat SDKの「Client Simulator」っていう機能が有効になっているか確認してね。これがないと、Unity上では正しくデバッグできないんだ。
- [Yodo]エラーは設定ミス!
- Consoleに[Yodo]で始まるエラーが出ていたら、それはタグマーカーの設定が間違っているサイン。メッセージをよく読んで、修正しよう。
- フォントの限界かも?「Failed to update dynamic font…」
- もし「Failed to update dynamic font (フォント名) texture; all the needed characters do not fit onto a single texture (max size 4096). Try using less text or a smaller font size.」っていう長いエラーが出ていたら、それはシーンの中に表示しようとしている文字の種類が多すぎて、Unityが一度に処理できる限界を超えちゃってるってことなんだ。これはUdonだけではどうにもならないUnity側の制限だよ。
- 対策としては…
- タグに表示する文字数を減らす。
- 各Canvasの「Canvas Scaler」コンポーネントの「Dynamic Pixels Per Unit」の値を下げてみる(文字が少しぼやけるかも)。
- または、「Reference Pixels Per Unit」の値を上げてみる。
- 文字じゃなくて、画像でタグを作る(画像化する)。
- 他のエラーが原因かも?
- [Yodo]以外のエラーが出ている場合は、他のアセットとか、自分で書いた別のUdonスクリプトが原因の可能性が高いよ。まずはそっちのエラーを解決してから、もう一度タグマーカーを試してみてね。
6. 一部の文字が消えたり、チカチカしたりする…
- まずはConsoleをチェック!
- 上の「Unity上で実行するとエラーが出る」の項目で説明した「Failed to update dynamic font…」のエラーが出ていないか確認してみて。もし出ていたら、同じ対策を試してみてね。
- 文字が見切れてるだけかも?
- エラーが出ていない場合は、単純にタグの表示エリアの横幅が狭くて、文字が全部表示しきれずに見切れているだけかもしれないよ。
- タグのオブジェクトのRectTransformで、横幅(Width)を文字数に合わせて十分な大きさに調整してみてね。
7. タグを「どれか一つだけ選ぶ」みたいにしたいんだけど… (排他的動作)
- ごめんね、その機能は今のところないんだ…
- 「このタグを付けたら、あのタグは自動で外れる」みたいな、タグ同士の関係を設定する機能は、今の「ヨドコロちゃんのタグマーカー」には用意されてないんだって。
- セットアップがすごく複雑になっちゃうから、今のところ対応予定もないみたい。
- もしそういう動作をさせたい場合は、ワールド内に「このタグとこのタグは一緒に付けないでね!」みたいな注意書きを添えるとか、運用でカバーする形になっちゃうかな。
8. ワールドに入った時に、最初から特定のタグを付けておきたい! (デフォルト設定)
- うーん、これも今のところは…
- ワールドに入ったときに、自動的に特定のタグがONになっている、っていう機能も、今のところ対応予定はないみたい。
- もし「どうしても欲しい!」っていう要望があったら、制作者のヨドコロちゃんに伝えてみると、検討してくれるかもしれないよ。(連絡先はマニュアルの「クレジット」を見てね!)
- 応用編として、操作パネル以外からタグをToggleする方法(SendCustomEvent(“Yodo_TagButton_XX”))はあるけど、ワールド読み込み直後のStart()とかOnPlayerJoined()の中ですぐに実行しても、同期のタイミングの問題で必ずしもうまくいくとは限らないから注意が必要だよ。
9. 他の人のタグを、私が強制的に変えたいんだけど!
- むむむ、それも難しいみたい…
- イベントの司会者が参加者のタグを変える、みたいな機能も、操作もセットアップもすごく複雑になっちゃうから、今のところ対応予定はないんだって。
- これも、「イベントでこういう時にどうしても必要で…!」みたいな具体的な要望があったら、ヨドコロちゃんに相談してみると、内容によっては考えてくれるかもしれないよ。
10. なんだかワールドの容量がすごく大きくなっちゃった…
- フォントファイルが原因かも!
- 「ヨドコロちゃんのタグマーカー」のサンプルでは、「Noto Sans CJK JP」っていう日本語もキレイに表示できるフォントを使っているんだけど、このフォントファイル自体が結構サイズが大きいんだ(16MBくらい増えることも)。
- Unity標準のフォントだと日本語の表示がおかしくなったり、TextMeshProの標準フォントだと日本語に対応してなかったりするから、便利なフォントなんだけどね。
- 容量を節約するには?
- タグの表示を文字じゃなくて、画像にしちゃう。
- もっと軽量な別のフォントを探してきて差し替える。
- TextMeshProの「Font Atlas Creator」っていう機能を使って、ワールドで実際に使っている文字だけを抜き出してフォントファイルを作る(これでグッと軽くなるよ!)。
- これらはUnity自体の機能だから、「Unity TMP フォント 軽量化」とかで検索すると、詳しいやり方がいっぱい出てくるよ!
- 裏技として、TextMeshProでわざとフォントが見つからない状態(フォールバック)にすると、VRChatクライアントに内蔵されてるフォントが使われて軽くなる、なんてテクニックもあるみたいだよ。(参考URL: https://power-of-tech.hatenablog.com/entry/2023/03/24/182926)
11. タグマーカーサポーターで作った操作パネルやマーカーの幅・高さが合わない!
- 手動調整でバッチリ決めよう!
- タグマーカーサポーターで自動生成したとき、文字のサイズとかタグの数(カラム数)によっては、どうしても幅や高さがピッタリ合わなくて、文字がはみ出ちゃったり、逆にスカスカになっちゃったりすることがあるんだ。
- そういう時は、それぞれのCanvas(操作パネルやマーカーのCanvas)のインスペクターにある「RectTransform」コンポーネントを見て、「Width」(幅)と「Height」(高さ)の値を、自分でいい感じに調整してみてね!
12. タグをいっぱい付けると、アバターの頭とかにめり込んじゃう!
- マーカーのアンカー位置がポイント!
- マーカーを表示するCanvasの「アンカー」っていう基準点が、Canvasの下側じゃなくて真ん中とかになっちゃってると、タグが増えたときに上だけじゃなくて下にも伸びちゃって、特に小さいアバターだと体にめり込んじゃうことがあるんだ。
- めり込み防止設定はこうやるよ!
- まず、マーカーのCanvasコンポーネントが付いているGameObjectを選択してね。
- インスペクターの「RectTransform」コンポーネントにある「Pivot」っていうプロパティの「Y」の値を「0」にするんだ。
- そうすると、「Pos Y」の値が自動で変わっちゃうから、これも改めて「0」に設定し直してね。
- 両方の値を「0」にすると、Canvasを選択したときに、ギズモ(操作ハンドル)がCanvasの下の端っこに出るようになるはず。これで設定完了!
- この状態になると、マーカーはアバターの頭上の、Canvasの下端を基準に追従するようになって、タグが増えても上方向にだけ伸びるようになるから、もうめり込む心配はなくなるはずだよ!ちっちゃいアバターでもバッチリ!
エラーはキミの相棒!UdonSharpともっと仲良くなろう!
ふぅ~、UdonSharpのエラー30選、どうだったかな?「うわ、こんなにあるの!?」って思ったかもしれないけど、一個一個見ていくと、ちゃんと理由があって、解決方法も見えてくるもんだよね!
UdonSharpは、VRChatのワールドに命を吹き込む魔法の杖みたいなもの。最初はちょっとクセがあるように感じるかもしれないけど、仲良くなればなるほど、キミの「作りたい!」っていう気持ちを形にしてくれる最高のパートナーになってくれるはずだよ!
エラーが出ても、それはUdonSharpがキミに「もっとこうしたら良くなるよ!」って話しかけてくれてるんだと思って、前向きに楽しんでいこうね!
もし、どうしても分からないエラーが出ちゃったら、VRChatの公式ドキュメントを見たり、ワールド制作をしてる先輩たちに聞いてみたりするのも、すごくいい方法だよ!
それじゃあ、キミの素敵なUdonSharpワールドが完成するのを、ヒロも楽しみにしてるね!
Happy World Crafting! ヒロでした!またね~!
エラーは怖くない!キミの成長のバネにしちゃおう!
どうだったかな?エラーメッセージって、最初は「うっ…」ってなるかもしれないけど、こうして意味が分かると、なんだか解決できそうな気がしてこない?
エラーが出るたびに、キミはUnityのことをもっともっと深く知れるチャンスなんだ。だから、エラーを恐れないで、どんどん新しいことに挑戦していってほしいな!