🍜

UdonSharpでメッシュの法線が取得できない場合の対処

2025/01/21に公開

概要

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();

スムーズシェードの法線が欲しい場合は自力で計算する必要があるそうなのですが、ありがたいことに計算方法を記事にしてくださっている方がいらっしゃいました。(下記リンク)

https://norio.hatenadiary.jp/entry/2017/01/23/081937

おまけ

UdonSharpではMeshオブジェクトを直接取得しようとするとエラーが出てしまいます。

Mesh MeshObject = GetComponent<MeshFilter>().mesh; // エラー出る

回避策として、MeshではなくMeshFilterを取得しておき、MeshFilter.meshとしてMeshオブジェクトを参照することができます。

MeshFilter MeshFilterObject = GetComponent<MeshFilter>(); // エラー出ない
Debug.Log(MeshFilterObject.mesh.normals.Length); // メッシュの法線の要素数を表示

参考

https://docs.unity3d.com/2022.3/Documentation/ScriptReference/Mesh.RecalculateNormals.html

Discussion