public void BuildObjects(GameObject springBoneRoot, GameObject colliderRoot, IEnumerable <string> requiredBones) { var managerProperties = PersistentSpringManagerProperties.Create( springBoneRoot.GetComponentInChildren <SpringManager>()); SpringBoneSetup.DestroySpringManagersAndBones(springBoneRoot); if (requiredBones != null) { FilterBoneRecordsByRequiredBonesAndCreateUnrecordedBones(springBoneRoot, requiredBones); } var initialTransforms = GameObjectUtil.BuildNameToComponentMap <Transform>(springBoneRoot, true); foreach (var record in pivotRecords) { BuildPivotFromSerializer(initialTransforms, record); } var setupMaps = SpringBoneSetupMaps.Build(springBoneRoot, colliderRoot); foreach (var record in springBoneRecords) { BuildSpringBoneFromSerializer(setupMaps, record); } var springManager = springBoneRoot.AddComponent <SpringManager>(); if (managerProperties != null) { managerProperties.ApplyTo(springManager); } SpringBoneSetup.FindAndAssignSpringBones(springManager); }
public void BuildObjects(GameObject springBoneRoot, GameObject colliderRoot, IEnumerable <string> requiredBones) { DestroyOldSpringBones(springBoneRoot); if (requiredBones != null) { FilterBoneRecordsByRequiredBonesAndCreateUnrecordedBones(springBoneRoot, requiredBones); } var initialTransforms = GameObjectUtil.BuildNameToComponentMap <Transform>(springBoneRoot, true); foreach (var record in pivotRecords) { SetupPivotFromSerializer(initialTransforms, record); } var setupMaps = SpringBoneSetupMaps.Build(springBoneRoot, colliderRoot); foreach (var record in springBoneRecords) { SetupSpringBoneFromSerializer(setupMaps, record); } var springManager = GameObjectUtil.AcquireComponent <SpringManager>(springBoneRoot, true); SpringBoneSetup.FindAndAssignSpringBones(springManager); }
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; springBone.lodLevel = baseData.lodLevel; springBone.lodMode = (SpringBone.LODMode)baseData.lodMode; springBone.lengthLimitStiffness = baseData.lengthLimitStiffness; springBone.isLengthLimitPercentage = baseData.isLengthLimitPercentage; springBone.lengthLimitMode = (SpringBone.LengthLimitMode)baseData.lengthLimitMode; // 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); }