private static void AttachDynamicBoneFieldT <T>(Transform targetRoot) where T : Component { var inline = _streamReader.ReadLine(); while (!string.IsNullOrEmpty(inline)) { var split = inline.Split(','); //この場合はエラー if (CiferTechUtils.FindSameNameTransformInChildren(split[0], targetRoot) == null) { inline = _streamReader.ReadLine(); continue; } var target = CiferTechUtils.FindOrCreateT <DynamicBone>(split[0], targetRoot); var list = new List <T>(); for (var i = 1; i < split.Length; i++) { list.Add(CiferTechUtils.FindSameNameTransformInChildren(split[i], targetRoot)?.GetComponent <T>()); } if (typeof(T) == typeof(DynamicBoneColliderBase)) { target.m_Colliders = list as List <DynamicBoneColliderBase>; } else if (typeof(T) == typeof(Transform)) { target.m_Exclusions = list as List <Transform>; } inline = _streamReader.ReadLine(); } }
private static void AttachAnimationCurve(Transform targetRoot, DynamicBoneDynamicsCsv.FieldType type) { var inline = _streamReader.ReadLine(); while (!string.IsNullOrEmpty(inline)) { var split = inline.Split(','); //この場合はエラー if (CiferTechUtils.FindSameNameTransformInChildren(split[0], targetRoot) == null) { inline = _streamReader.ReadLine(); continue; } var target = CiferTechUtils.FindOrCreateT <DynamicBone>(split[0], targetRoot); var field = typeof(DynamicBone).GetField(type.ToString()); if (field != null) { field.SetValue(target, new AnimationCurve { keys = MoldKeyFrames(split) }); } inline = _streamReader.ReadLine(); } }
private static void SetParent(Transform target, Transform targetRoot, IReadOnlyList <string> split) { if ((target.parent != null ? target.parent.name : null) != split[0]) { target.SetParent(CiferTechUtils.FindSameNameTransformInChildren(split[0], targetRoot)); } target.transform.localPosition = new Vector3(Convert.ToSingle(split[2]), Convert.ToSingle(split[3]), Convert.ToSingle(split[4])); target.transform.localRotation = new Quaternion(Convert.ToSingle(split[5]), Convert.ToSingle(split[6]), Convert.ToSingle(split[7]), Convert.ToSingle(split[8])); }
private static void AttachDynamicBone(Transform targetRoot) { var inline = _streamReader.ReadLine(); while (!string.IsNullOrEmpty(inline)) { var split = inline.Split(','); var isNUllOrEmpty = string.IsNullOrEmpty(split[0]); //この場合はエラー if (CiferTechUtils.FindSameNameTransformInChildren(split[0], targetRoot) == null && !isNUllOrEmpty) { inline = _streamReader.ReadLine(); continue; } var target = isNUllOrEmpty ? targetRoot.gameObject.AddComponent <DynamicBone>() : CiferTechUtils.FindOrCreateT <DynamicBone>(split[1], targetRoot); SetParent(target.transform, targetRoot, split); target.m_Root = CiferTechUtils.FindSameNameTransformInChildren(split[9], targetRoot); target.m_UpdateRate = Convert.ToSingle(split[10]); target.m_UpdateMode = (DynamicBone.UpdateMode)Convert.ToInt32(split[11]); target.m_Damping = Convert.ToSingle(split[12]); target.m_Elasticity = Convert.ToSingle(split[13]); target.m_Stiffness = Convert.ToSingle(split[14]); target.m_Inert = Convert.ToSingle(split[15]); target.m_Friction = Convert.ToSingle(split[16]); target.m_Radius = Convert.ToSingle(split[17]); target.m_EndLength = Convert.ToSingle(split[18]); target.m_EndOffset.Set(Convert.ToSingle(split[19]), Convert.ToSingle(split[20]), Convert.ToSingle(split[21])); target.m_Gravity.Set(Convert.ToSingle(split[22]), Convert.ToSingle(split[23]), Convert.ToSingle(split[24])); target.m_Force.Set(Convert.ToSingle(split[25]), Convert.ToSingle(split[26]), Convert.ToSingle(split[27])); target.m_FreezeAxis = (DynamicBone.FreezeAxis)Convert.ToInt32(split[28]); target.m_DistantDisable = Convert.ToBoolean(split[29]); target.m_ReferenceObject = CiferTechUtils.FindSameNameTransformInChildren(split[30], targetRoot); target.m_DistanceToObject = Convert.ToSingle(split[31]); inline = _streamReader.ReadLine(); } }
private static void CreateDynamicBoneColliders(Transform targetRoot) { var inline = _streamReader.ReadLine(); while (!string.IsNullOrEmpty(inline)) { var split = inline.Split(','); var isNUllOrEmpty = string.IsNullOrEmpty(split[0]); //この場合はエラー if (CiferTechUtils.FindSameNameTransformInChildren(split[0], targetRoot) == null && !isNUllOrEmpty) { inline = _streamReader.ReadLine(); continue; } DynamicBoneColliderBase target; //TRUE: DynamicBoneCollider, FALSE: DynamicBonePlaneCollider if (split.Length > 14) { target = isNUllOrEmpty ? targetRoot.gameObject.AddComponent <DynamicBoneCollider>() : CiferTechUtils.FindOrCreateT <DynamicBoneCollider>(split[1], targetRoot); var dynamicBoneCollider = (DynamicBoneCollider)target; dynamicBoneCollider.m_Radius = Convert.ToSingle(split[14]); dynamicBoneCollider.m_Height = Convert.ToSingle(split[15]); } else { target = isNUllOrEmpty ? targetRoot.gameObject.AddComponent <DynamicBonePlaneCollider>() : CiferTechUtils.FindOrCreateT <DynamicBonePlaneCollider>(split[1], targetRoot); } SetParent(target.transform, targetRoot, split); target.m_Direction = (DynamicBoneColliderBase.Direction)Convert.ToInt32(split[9]); target.m_Center.Set(Convert.ToSingle(split[10]), Convert.ToSingle(split[11]), Convert.ToSingle(split[12])); target.m_Bound = (DynamicBoneColliderBase.Bound)Convert.ToInt32(split[13]); inline = _streamReader.ReadLine(); } }
public static void Resetting(MigrateVrmSettingsData data) { #region Meta if (data.IsMeta) { data.NewVrm.Meta = data.OldVrm.Meta; } #endregion #region BlendShape if (data.IsBlendShape) { var newVrmBlendShapeProxy = data.NewVrm.GetComponent <VRMBlendShapeProxy>(); var oldVrmBlendShapeProxy = data.OldVrm.GetComponent <VRMBlendShapeProxy>(); var oldClips = oldVrmBlendShapeProxy.BlendShapeAvatar.Clips; var newClips = newVrmBlendShapeProxy.BlendShapeAvatar.Clips; var oldBlendShapeSmr = oldVrmBlendShapeProxy.GetComponentsInChildren <SkinnedMeshRenderer>() .Where(renderer => renderer.sharedMesh.blendShapeCount > 0); var newBlendShapeSmr = oldVrmBlendShapeProxy.GetComponentsInChildren <SkinnedMeshRenderer>() .Where(renderer => renderer.sharedMesh.blendShapeCount > 0); for (var i = 0; i < oldClips.Count; i++) { //BlendShapeBinding if (newClips.Count <= i) { newClips.Add(oldClips[i]); } newClips[i].BlendShapeName = oldClips[i].BlendShapeName; newClips[i].Values = (from binding in oldClips[i].Values let blendShapeName = oldBlendShapeSmr.FirstOrDefault(smr => smr.name == binding.RelativePath) ?.sharedMesh.GetBlendShapeName(binding.Index) where !string.IsNullOrEmpty(blendShapeName) let blendShapeIndex = newBlendShapeSmr.FirstOrDefault(smr => smr.name == binding.RelativePath) ?.sharedMesh.GetBlendShapeIndex(blendShapeName) ?? -1 select new BlendShapeBinding() { RelativePath = binding.RelativePath, Index = blendShapeIndex < 0 ? binding.Index : blendShapeIndex, Weight = binding.Weight, }).ToArray(); newClips[i].MaterialValues = oldClips[i].MaterialValues; EditorUtility.SetDirty(newClips[i]); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } #endregion #region FirstPerson if (data.IsFirstPerson) { var oldFirstPerson = data.OldVrm.GetComponent <VRMFirstPerson>(); var newFirstPerson = data.NewVrm.GetComponent <VRMFirstPerson>(); newFirstPerson.FirstPersonBone = CiferTechUtils.FindSameNameTransformInChildren(oldFirstPerson.FirstPersonBone.name, newFirstPerson.transform); newFirstPerson.FirstPersonOffset = oldFirstPerson.FirstPersonOffset; foreach (var oldRenderer in oldFirstPerson.Renderers.Where(oldRenderer => oldRenderer.Renderer != null)) { for (var i = 0; i < newFirstPerson.Renderers.Count; i++) { if (newFirstPerson.Renderers[i].Renderer == null) { continue; } if (oldRenderer.Renderer.name != newFirstPerson.Renderers[i].Renderer.name) { continue; } newFirstPerson.Renderers[i] = new VRMFirstPerson.RendererFirstPersonFlags() { Renderer = newFirstPerson.Renderers[i].Renderer, FirstPersonFlag = oldRenderer.FirstPersonFlag }; } } } #endregion #region LookAtBoneApplyer if (data.IsLookAtBoneApplyer) { var oldVrmLookAtBoneApplyer = data.OldVrm.GetComponent <VRMLookAtBoneApplyer>(); var newVrmLookAtBoneApplyer = data.NewVrm.GetComponent <VRMLookAtBoneApplyer>(); newVrmLookAtBoneApplyer.HorizontalOuter = oldVrmLookAtBoneApplyer.HorizontalOuter; newVrmLookAtBoneApplyer.HorizontalInner = oldVrmLookAtBoneApplyer.HorizontalInner; newVrmLookAtBoneApplyer.VerticalDown = oldVrmLookAtBoneApplyer.VerticalDown; newVrmLookAtBoneApplyer.VerticalUp = oldVrmLookAtBoneApplyer.VerticalUp; } #endregion #region Material if (data.IsMaterial) { var oldSmrArray = data.OldVrm.GetComponentsInChildren <SkinnedMeshRenderer>(); var newSmrArray = data.NewVrm.GetComponentsInChildren <SkinnedMeshRenderer>(); foreach (var oldSmr in oldSmrArray) { foreach (var newSmr in newSmrArray) { if (oldSmr.name != newSmr.name) { continue; } for (var i = 0; i < newSmr.sharedMaterials.Length; i++) { newSmr.sharedMaterials = oldSmr.sharedMaterials; } } } } #endregion #region SpringBone if (data.IsSpringBone) { var newSecondaryTransform = data.NewVrm.transform.Find("secondary"); var oldSpringBones = data.OldVrm.GetComponentsInChildren <VRMSpringBone>(); var oldColliders = data.OldVrm.GetComponentsInChildren <VRMSpringBoneColliderGroup>(); CiferTechUtils.DeleteExistSetting <VRMSpringBone>(newSecondaryTransform, false); CiferTechUtils.DeleteExistSetting <VRMSpringBoneColliderGroup>(data.NewVrm.transform, true); foreach (var oldCollider in oldColliders) { var targetTransform = CiferTechUtils.FindSameNameTransformInChildren(oldCollider.name, data.NewVrm.transform); if (targetTransform == null) { continue; } var newCollider = targetTransform.gameObject.AddComponent <VRMSpringBoneColliderGroup>(); newCollider.Colliders = oldCollider.Colliders; } foreach (var oldSpringBone in oldSpringBones) { var newSpringBone = newSecondaryTransform.gameObject.AddComponent <VRMSpringBone>(); newSpringBone.m_comment = oldSpringBone.m_comment; newSpringBone.m_stiffnessForce = oldSpringBone.m_stiffnessForce; newSpringBone.m_gravityPower = oldSpringBone.m_gravityPower; newSpringBone.m_gravityDir = oldSpringBone.m_gravityDir; newSpringBone.m_dragForce = oldSpringBone.m_dragForce; if (oldSpringBone.m_center != null) { newSpringBone.m_center = CiferTechUtils.FindSameNameTransformInChildren(oldSpringBone.m_center.name, data.NewVrm.transform); } newSpringBone.RootBones = new List <Transform>(); foreach (var oldRootBone in oldSpringBone.RootBones) { newSpringBone.RootBones.Add( CiferTechUtils.FindSameNameTransformInChildren(oldRootBone.name, data.NewVrm.transform)); } newSpringBone.m_hitRadius = oldSpringBone.m_hitRadius; newSpringBone.ColliderGroups = oldSpringBone.ColliderGroups .Select(oldCollider => CiferTechUtils.FindSameNameTransformInChildren(oldCollider.name, data.NewVrm.transform) ?.GetComponent <VRMSpringBoneColliderGroup>()) .Where(targetCollider => targetCollider != null).ToArray(); } } #endregion Debug.Log($"{typeof(MigrateVrmSettings)}: 設定の移行が完了しました!"); }