public static SpringManager PerformSetup ( GameObject rootObject, IEnumerable <GameObject> newSpringBones, AutoSetupParameters parameters ) { SpringBoneSetup.DestroySpringManagersAndBones(rootObject); SpringColliderSetup.DestroySpringColliders(rootObject); var springBones = new List <SpringBone>(); foreach (var boneParent in newSpringBones.Where(boneParent => boneParent.transform.childCount > 0)) { springBones.Add(boneParent.AddComponent <SpringBone>()); } var manager = rootObject.AddComponent <SpringManager>(); SpringBoneSetup.FindAndAssignSpringBones(manager, true); if (parameters.createPivots) { foreach (var springBone in springBones) { SpringBoneSetup.CreateSpringPivotNode(springBone); } } return(manager); }
private void FilterBoneRecordsByRequiredBonesAndCreateUnrecordedBones ( GameObject springBoneRoot, IEnumerable <string> requiredBones ) { var boneRecordsToUse = springBoneRecords .Where(record => requiredBones.Contains(record.baseData.boneName)); var recordedBoneNames = boneRecordsToUse.Select(record => record.baseData.boneName); var bonesWithoutRecords = requiredBones .Except(recordedBoneNames) .Select(boneName => GameObjectUtil.FindChildByName(springBoneRoot, boneName)) .Where(item => item != null) .Select(item => item.gameObject); foreach (var bone in bonesWithoutRecords) { var springBone = bone.AddComponent <SpringBone>(); SpringBoneSetup.CreateSpringPivotNode(springBone); } // Report the skipped bone records so the user knows var skippedBoneRecords = springBoneRecords.Except(boneRecordsToUse); foreach (var skippedRecord in skippedBoneRecords) { Debug.LogWarning(skippedRecord.baseData.boneName + "\nボーンリストにないので作成しません"); } springBoneRecords = boneRecordsToUse; }
public static void UpdateSpringManagerFromBoneList(SpringManager springManager) { var rootObject = springManager.gameObject; var designatedSpringBones = GetBonesDesignatedForDynamics(rootObject); var currentSpringBones = rootObject.GetComponentsInChildren <SpringBone>(true); var skinBones = GameObjectExtensions.GameObjectUtil.GetAllBones(rootObject); var springBonesToDestroy = currentSpringBones .Where(bone => !designatedSpringBones.Contains(bone.gameObject)); foreach (var boneToDestroy in springBonesToDestroy) { var pivot = boneToDestroy.pivotNode; if (pivot != null && SpringBoneSetup.IsPivotProbablySafeToDestroy(pivot, skinBones)) { SpringBoneSetup.DestroyUnityObject(pivot.gameObject); } SpringBoneSetup.DestroyUnityObject(boneToDestroy); } var objectsToAddBonesTo = designatedSpringBones .Where(bone => bone.GetComponent <SpringBone>() == null); foreach (var newBoneOwner in objectsToAddBonesTo) { var newSpringBone = newBoneOwner.AddComponent <SpringBone>(); SpringBoneSetup.CreateSpringPivotNode(newSpringBone); } SpringBoneSetup.FindAndAssignSpringBones(springManager, true); }
public static void CreatePivotForSpringBones() { if (Application.isPlaying) { Debug.LogError("再生モードを止めてください。"); return; } if (Selection.gameObjects.Length < 1) { Debug.LogError("一つ以上のオブジェクトを選択してください。"); return; } var selectedSpringBones = Selection.gameObjects .Select(gameObject => gameObject.GetComponent <SpringBone>()) .Where(bone => bone != null); foreach (var springBone in selectedSpringBones) { SpringBoneSetup.CreateSpringPivotNode(springBone); } }