見出し画像

[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を使うとうまくいきます

自作スクリプトはProBuilderShapeと同じGameObjectに配置する

あと制約っぽいのが一点。UnityEditor上で追加したShapeをC#から触りたい場合は同じGameObjectに自作スクリプトを配置する必要があります

結構色々とC#から触れるので、Scripting APIと睨めっこしながら試してもらえればといいかと!

最初に目を通すのはProBuilderMeshがいいかな...

privateなメソッドを使う

ランタイムで色々モデルを加工できるようになったのはよいのですが、OnValidateで再加工する手法で悩みました!

これがAPIで用意されていない

再加工するには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#すげぇ!!

スッキリ!

いいなと思ったら応援しよう!