こんにちは、久しぶりにUnityを触るARエンジニアのイワケンです。
VRChat向けにSetUpしたキャラクターを、VRM向けファイルにセットアップする際に**「DynamicBoneコンポーネント外したい!」**と思うわけですが、子供の階層にたくさんあるので、手動で行うと面倒くさいです。
これをEditor拡張の実装でワンポチで解決しましょう。
手順
- RemoveDynamicBone.csを作る
- RemoveDynamicBoneComponentsInChildren関数を実装
- ヒエラルキー上のキャラクターにアタッチ
- RemoveDynamicBoneComponentsInChildren関数をインスペクターから呼び出す
RemoveDynamicBoneComponents関数を実装
RemoveDynamicBone.cs
using UnityEditor;
using UnityEngine;
public class RemoveDynamicBone : MonoBehaviour
{
/// <summary>
/// 子供のオブジェクトのDynamicBoneをすべてRemoveする
/// </summary>
public void RemoveDynamicBoneComponentsInChildren()
{
foreach (DynamicBone bone in GetComponentsInChildren<DynamicBone>())
{
DestroyImmediate(bone);
}
}
public void CountDynamicBoneComponentsInChildren()
{
int count = GetComponentsInChildren<DynamicBone>().Length;
Debug.Log($"DynamicBoneの数は{count}個です");
}
}
[CustomEditor(typeof(RemoveDynamicBone))]//拡張するクラスを指定
public class RemoveDynamicBoneEditor : Editor
{
/// <summary>
/// InspectorのGUIを更新
/// </summary>
public override void OnInspectorGUI()
{
//元のInspector部分を表示
base.OnInspectorGUI();
RemoveDynamicBone script = target as RemoveDynamicBone;
//実行するボタンを置く
if (GUILayout.Button("子供のDynamicBoneの数をDebug.Log"))
{
script.CountDynamicBoneComponentsInChildren();
}
//実行するボタンを置く
if (GUILayout.Button("子供のDynamicBoneを削除"))
{
script.RemoveDynamicBoneComponentsInChildren();
}
}
}
ヒエラルキー上のキャラクターにアタッチ
そして「子供のDynamicBoneの数をDebug.Log」を押すと、数が表示されました。18ですね。
その後に子供のDunamicBoneを削除を押すと...?
「DynamicBoneの数は0個です」になりました!
ちゃんとRemovedされてました!!
参考記事
使用キャラモデル