Esempio n. 1
0
        public static IEnumerable <Validation> Validate(GameObject ExportRoot)
        {
            if (!ExportRoot)
            {
                yield break;
            }

            if (MeshInformations != null)
            {
                if (HasRotationOrScale(ExportRoot) || MeshInformations.Any(x => x.ExportBlendShapeCount > 0 && !x.HasSkinning))
                {
                    // 正規化必用
                    if (EnableFreeze)
                    {
                        // する
                        yield return(Validation.Info("PoseFreeze checked. OK"));
                    }
                    else
                    {
                        // しない
                        yield return(Validation.Warning(ValidationMessages.ROTATION_OR_SCALEING_INCLUDED_IN_NODE.Msg()));
                    }
                }
                else
                {
                    // 不要
                    if (EnableFreeze)
                    {
                        // する
                        yield return(Validation.Warning(ValidationMessages.IS_POSE_FREEZE_DONE.Msg()));
                    }
                    else
                    {
                        // しない
                        yield return(Validation.Info("Root OK"));
                    }
                }
            }

            //
            // animator
            //
            var animator = ExportRoot.GetComponent <Animator>();

            if (animator == null)
            {
                yield return(Validation.Critical(ValidationMessages.NO_ANIMATOR.Msg()));

                yield break;
            }

            // avatar
            var avatar = animator.avatar;

            if (avatar == null)
            {
                yield return(Validation.Critical(ValidationMessages.NO_AVATAR_IN_ANIMATOR.Msg()));

                yield break;
            }
            if (!avatar.isValid)
            {
                yield return(Validation.Critical(ValidationMessages.AVATAR_IS_NOT_VALID.Msg()));

                yield break;
            }
            if (!avatar.isHuman)
            {
                yield return(Validation.Critical(ValidationMessages.AVATAR_IS_NOT_HUMANOID.Msg()));

                yield break;
            }
            // direction
            {
                var l = animator.GetBoneTransform(HumanBodyBones.LeftUpperLeg);
                var r = animator.GetBoneTransform(HumanBodyBones.RightUpperLeg);
                var f = GetForward(l, r);
                if (Vector3.Dot(f, Vector3.forward) < 0.8f)
                {
                    yield return(Validation.Critical(ValidationMessages.FACE_Z_POSITIVE_DIRECTION.Msg()));

                    yield break;
                }
            }

            {
                var lu = animator.GetBoneTransform(HumanBodyBones.LeftUpperArm);
                var ll = animator.GetBoneTransform(HumanBodyBones.LeftLowerArm);
                var ru = animator.GetBoneTransform(HumanBodyBones.RightUpperArm);
                var rl = animator.GetBoneTransform(HumanBodyBones.RightLowerArm);
                if (Vector3.Dot((ll.position - lu.position).normalized, Vector3.left) < 0.8f ||
                    Vector3.Dot((rl.position - ru.position).normalized, Vector3.right) < 0.8f)
                {
                    yield return(Validation.Error(ValidationMessages.NOT_TPOSE.Msg()));
                }
            }

            var jaw = animator.GetBoneTransform(HumanBodyBones.Jaw);

            if (jaw != null)
            {
                yield return(Validation.Warning(ValidationMessages.JAW_BONE_IS_INCLUDED.Msg()));
            }
        }