コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
        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]));
        }
コード例 #4
0
        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();
            }
        }
コード例 #5
0
        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();
            }
        }
コード例 #6
0
        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)}: 設定の移行が完了しました!");
        }