public static void UpdateSpringManagerFromBoneList(SpringManager springManager) { var rootObject = springManager.gameObject; var designatedSpringBones = GetBonesDesignatedForDynamics(rootObject); var currentSpringBones = rootObject.GetComponentsInChildren <SpringBone>(true); var skinBones = 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); }
private void PerformMirror() { var mirrorItems = boneEntries.Where( item => item.sourceBone != null && item.targetBone != null && item.sourceBone != item.targetBone); var undoItems = mirrorItems.Select(item => (Component)item.targetBone).ToList(); var allSkinBones = GameObjectUtil.FindComponentsOfType <SkinnedMeshRenderer>() .SelectMany(renderer => renderer.bones) .Distinct() .ToArray(); var editablePivots = mirrorItems .Select(item => item.targetBone.pivotNode) .Where(pivotNode => pivotNode != null && SpringBoneSetup.IsPivotProbablySafeToDestroy(pivotNode, allSkinBones)) .ToArray(); undoItems.AddRange(editablePivots); Undo.RecordObjects(undoItems.ToArray(), "Mirror SpringBones"); foreach (var mirrorItem in mirrorItems) { var sourceBone = mirrorItem.sourceBone; var targetBone = mirrorItem.targetBone; var rootManager = targetBone.GetComponentInParent <SpringManager>(); if (rootManager == null) { continue; } targetBone.stiffnessForce = sourceBone.stiffnessForce; targetBone.dragForce = sourceBone.dragForce; targetBone.springForce = sourceBone.springForce; targetBone.windInfluence = sourceBone.windInfluence; if (editablePivots.Contains(targetBone.pivotNode)) { MirrorPivot(sourceBone, targetBone); } targetBone.angularStiffness = sourceBone.angularStiffness; sourceBone.yAngleLimits.CopyTo(targetBone.yAngleLimits); sourceBone.zAngleLimits.CopyTo(targetBone.zAngleLimits); targetBone.yAngleLimits.min = -sourceBone.yAngleLimits.max; targetBone.yAngleLimits.max = -sourceBone.yAngleLimits.min; targetBone.lengthLimitTargets = FindMirroredComponents( rootManager.gameObject, sourceBone.lengthLimitTargets, mirrorAxis) .Where(item => item != null) .ToArray(); targetBone.radius = sourceBone.radius; targetBone.sphereColliders = FindMirroredComponents( rootManager.gameObject, sourceBone.sphereColliders, mirrorAxis) .Where(item => item != null) .ToArray(); targetBone.capsuleColliders = FindMirroredComponents( rootManager.gameObject, sourceBone.capsuleColliders, mirrorAxis) .Where(item => item != null) .ToArray(); targetBone.panelColliders = FindMirroredComponents( rootManager.gameObject, sourceBone.panelColliders, mirrorAxis) .Where(item => item != null) .ToArray(); } }
private static bool BuildSpringBoneFromSerializer ( SpringBoneSetupMaps setupMaps, SpringBoneSerializer serializer ) { var baseData = serializer.baseData; Transform childBone = null; if (!setupMaps.allChildren.TryGetValue(baseData.boneName, out childBone)) { Debug.LogError("ボーンが見つかりません: " + baseData.boneName); return(false); } var springBone = childBone.gameObject.AddComponent <SpringBone>(); springBone.stiffnessForce = baseData.stiffness; springBone.dragForce = baseData.drag; springBone.springForce = baseData.springForce; springBone.windInfluence = baseData.windInfluence; springBone.angularStiffness = baseData.angularStiffness; springBone.yAngleLimits = BuildAngleLimitsFromSerializer(baseData.yAngleLimits); springBone.zAngleLimits = BuildAngleLimitsFromSerializer(baseData.zAngleLimits); springBone.radius = baseData.radius; // Pivot node var pivotNodeName = baseData.pivotName; Transform pivotNode = null; if (pivotNodeName.Length > 0) { if (!setupMaps.allChildren.TryGetValue(pivotNodeName, out pivotNode)) { Debug.LogError("Pivotオブジェクトが見つかりません: " + pivotNodeName); pivotNode = null; } } if (pivotNode == null) { pivotNode = springBone.transform.parent ?? springBone.transform; } else { var skinBones = GameObjectUtil.GetAllBones(springBone.transform.root.gameObject); if (pivotNode.GetComponent <SpringBonePivot>() && SpringBoneSetup.IsPivotProbablySafeToDestroy(pivotNode, skinBones)) { pivotNode.position = springBone.transform.position; } } springBone.pivotNode = pivotNode; springBone.lengthLimitTargets = baseData.lengthLimits .Where(lengthLimit => setupMaps.allChildren.ContainsKey(lengthLimit.objectName)) .Select(lengthLimit => setupMaps.allChildren[lengthLimit.objectName]) .ToArray(); springBone.sphereColliders = serializer.colliderNames .Where(name => setupMaps.sphereColliders.ContainsKey(name)) .Select(name => setupMaps.sphereColliders[name]) .ToArray(); springBone.capsuleColliders = serializer.colliderNames .Where(name => setupMaps.capsuleColliders.ContainsKey(name)) .Select(name => setupMaps.capsuleColliders[name]) .ToArray(); springBone.panelColliders = serializer.colliderNames .Where(name => setupMaps.panelColliders.ContainsKey(name)) .Select(name => setupMaps.panelColliders[name]) .ToArray(); return(true); }