[Unity]ProBuilderの編集機能をスクリプトから使う
コード書いとる?
UnityのProBuilder便利ね。簡単なモデルがUnityEditor上でサクサク作れるので重宝してます!
で!ランタイム(アプリ実行時)でも色々できるっぽいので実際に試してみたメモ。ここはnote
ProBuilderの機能をC#から呼び出す
公式マニュアル
https://docs.unity3d.com/Packages/com.unity.probuilder@5.0/manual/index.html
試したのは5.0.7。バージョンが変わるとAPIの仕様も変わるかもしれない点にご留意ください
ランタイムでProBuilderの機能を使いたい場合はScripting API overviewから読み始めればよいのですがここで一点。サンプルコードそのままではエラーが出て動きません
quad.SetVertices(vertices);
quad.Rebuild(); // メソッドが存在しないのでエラーになる
quad.ToMesh(); // こっちを使う
Rebuildは内部処理用に用意されたメソッドで公開されておりません(将来なくなるかもしれない)。代わりにToMeshを使うとうまくいきます
あと制約っぽいのが一点。UnityEditor上で追加したShapeをC#から触りたい場合は同じGameObjectに自作スクリプトを配置する必要があります
結構色々とC#から触れるので、Scripting APIと睨めっこしながら試してもらえればといいかと!
最初に目を通すのはProBuilderMeshがいいかな...
privateなメソッドを使う
ランタイムで色々モデルを加工できるようになったのはよいのですが、OnValidateで再加工する手法で悩みました!
再加工するにはProBuilderMeshを加工前に戻す必要があるのですが、ProBuilderShapeのReset Shapeに該当するAPIが見当たりません
ProBuilderのソースコードを読み込んだ結果当該機能やクラスは全てprivateで隠蔽されていました。さて困ったぞ。
そこはC#のリフレクションを使えばいいじゃない!と思い当たったので試してみたら思ったとおりの挙動が実現できました!
var shape = GetComponent("ProBuilderShape");
var method = shape.GetType().GetMethod("UpdateComponent", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (method != null)
{
method.Invoke(shape, null);
}
おおおお...C#すげぇ!!
スッキリ!