コード例 #1
0
        protected void CreateBonePoseCallback(UMAData umaData)
        {
            UMA.PoseTools.UMABonePose bonePose = null;
            if (selectedConverter.startingPose == null)
            {
                bonePose = CreatePoseAsset("", bonePoseSaveName);
            }
            else
            {
                bonePose       = selectedConverter.startingPose;
                bonePose.poses = new UMABonePose.PoseBone[1];
            }

            UMASkeleton skeletonPreDNA  = tempAvatarPreDNA.GetComponent <UMADynamicAvatar>().umaData.skeleton;
            UMASkeleton skeletonPostDNA = tempAvatarPostDNA.GetComponent <UMADynamicAvatar>().umaData.skeleton;

            Transform transformPreDNA;
            Transform transformPostDNA;
            bool      transformDirty;
            int       parentHash;

            foreach (int boneHash in skeletonPreDNA.BoneHashes)
            {
                skeletonPreDNA.TryGetBoneTransform(boneHash, out transformPreDNA, out transformDirty, out parentHash);
                skeletonPostDNA.TryGetBoneTransform(boneHash, out transformPostDNA, out transformDirty, out parentHash);

                if ((transformPreDNA == null) || (transformPostDNA == null))
                {
                    Debug.LogWarning("Bad bone hash in skeleton: " + boneHash);
                    continue;
                }

                if (!LocalTransformsMatch(transformPreDNA, transformPostDNA))
                {
                    bonePose.AddBone(transformPreDNA, transformPostDNA.localPosition, transformPostDNA.localRotation, transformPostDNA.localScale);
                }
            }

            Destroy(tempAvatarPreDNA);
            Destroy(tempAvatarPostDNA);

            // This can be very helpful for testing

            /*
             * bonePose.ApplyPose(skeletonPreDNA, 1.0f);
             */

            EditorUtility.SetDirty(bonePose);
            AssetDatabase.SaveAssets();
            // Set this asset as the converters pose asset
            selectedConverter.startingPose = bonePose;
            //make sure its fully applied
            selectedConverter.startingPoseWeight = 1f;

            // Reset all the DNA values for target Avatar to default
            UMADnaBase[] targetDNA = activeUMA.umaData.GetAllDna();
            foreach (UMADnaBase dnaEntry in targetDNA)
            {
                for (int i = 0; i < dnaEntry.Values.Length; i++)
                {
                    dnaEntry.SetValue(i, 0.5f);
                }
            }

            // Optionally clear the DNA from the base recipe,
            // since it's now included in the new starting pose
            UMARecipeBase baseRaceRecipe = activeUMA.umaData.umaRecipe.GetRace().baseRaceRecipe;

            if (baseRaceRecipe != null)
            {
                if (EditorUtility.DisplayDialog("Base Recipe Cleanup", "Starting Pose created. Remove DNA from base recipe of active race?", "Remove DNA", "Keep DNA"))
                {
                    UMAData.UMARecipe baseRecipeData = new UMAData.UMARecipe();
                    baseRaceRecipe.Load(baseRecipeData, activeUMA.context);
                    baseRecipeData.ClearDna();
                    baseRaceRecipe.Save(baseRecipeData, activeUMA.context);
                }
            }
        }