🍜
UdonSharpでメッシュの法線が取得できない場合の対処
概要
UdonSharpでメッシュの法線が取得できない場合、Mesh.RecalculateNormals()で法線を再計算してくれます。
環境
- Unity 2022.3.22f1
- VRChat SDK - Base 3.6.1
- VRChat SDK - Worlds 3.6.1
問題
自分の環境だけかもしれませんが、UnityにインポートしたfbxなどのメッシュをUdonSharpで取得すると、法線が取得できない(Mesh.normalsの要素数が0になる)場合があります。
この問題はEditor上では起こらず、ビルドされたVRChat上でのみ起こります。
対処
以下のコードでメッシュの法線を再計算してくれます。(フラットシェード限定)
Mesh.RecalculateNormals();
スムーズシェードの法線が欲しい場合は自力で計算する必要があるそうなのですが、ありがたいことに計算方法を記事にしてくださっている方がいらっしゃいました。(下記リンク)
おまけ
UdonSharpではMeshオブジェクトを直接取得しようとするとエラーが出てしまいます。
Mesh MeshObject = GetComponent<MeshFilter>().mesh; // エラー出る
回避策として、MeshではなくMeshFilterを取得しておき、MeshFilter.meshとしてMeshオブジェクトを参照することができます。
MeshFilter MeshFilterObject = GetComponent<MeshFilter>(); // エラー出ない
Debug.Log(MeshFilterObject.mesh.normals.Length); // メッシュの法線の要素数を表示
参考
Discussion