サークル獏の佐藤敏 Unityとか備忘録

サークル獏の佐藤敏がUnityとかで知ったTipsを書いておく備忘録です。

DynamicBoneを(複数の)GameObjectに追加する拡張

若干仕様を追い切れているか自信がないのですが、とりあえず載せておきます。
DynamicBoneを(複数の)GameObjectに追加します。

ソースコード

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

public class DynamicBoneUtil {
	[MenuItem("GameObject/AddDynamicBone", false, 10)]
	public static void AddDynamicBone(MenuCommand command) {

		var list = Selection.gameObjects;

		foreach (var obj in list) {
			if (obj != command.context)
				continue;

			var col = obj.AddComponent<DynamicBone>();
			col.m_Root = obj.transform;

			var parent = obj.transform.parent;
			if (parent != null) {
				var headCol = parent.GetComponent<DynamicBoneCollider>();
				if (headCol != null) {
					if (col.m_Colliders == null)
						col.m_Colliders = new List<DynamicBoneColliderBase>();
					col.m_Colliders.Add(headCol);
				}
			}
		}
	}
}

これをDynamicBoneUtil.csとして、Editorフォルダ作ってその中に保存すると

f:id:VinSatoo:20190708201612p:plain
動作画面
こんな風に右クリックメニューにAddDynamicBoneが追加されます。
 

動作

・DynamicBoneを追加
・もしそのオブジェクトの親がDynamicBoneColliderを持っていたら、DynamicBoneのCollidersにソレを追加
(headにColliderをつけて、その子の髪にDynamicBoneをつけるパターンをイメージ)

col.m_Stiffness = 0.5f; とかを追加すれば DynamicBoneの初期パラメータをスキにいじることもできますね。
 

詰まったところ&注意点

フツーにやると「3つのGameObjectを選択していた場合、3つのオブジェクト全てに対して3つDynamicBoneがつく」みたいな動作に。command.contextをチェックすることで回避できるみたいです。
 
ただこれが、右クリックでなくメニューバーから呼び出した場合nullになっていることがあるなんて話もあるのでそこはご注意を。普通は右クリックから呼び出すと思いますが……
How to execute MenuItem for multiple objects once. - Unity Answers