private void SetBaseMesh(string assetPath) { var curDir = System.IO.Directory.GetCurrentDirectory().Replace('\\', '/'); if (assetPath.StartsWith(curDir, System.StringComparison.InvariantCultureIgnoreCase)) { assetPath = assetPath.Remove(0, curDir.Length + 1); } var asset = AssetDatabase.LoadMainAssetAtPath(assetPath); if (asset is GameObject) { RaceGO = Instantiate(asset) as GameObject; RaceSMR = RaceGO.GetComponentInChildren <SkinnedMeshRenderer>(); if (RaceSMR != null) { if (SlotSMR != null) { PerformValidation(); } else { NextPage(); } } else { UMAUtils.DestroySceneObject(RaceGO); } } }
public void ReplaceAll() { if (generateUMA || generateLotsUMA) { Debug.LogWarning("Can't replace while spawning."); return; } int childCount = gameObject.transform.childCount; while (--childCount >= 0) { Transform child = gameObject.transform.GetChild(childCount); UMAUtils.DestroySceneObject(child.gameObject); } if (umaCrowdSize.x <= 1 && umaCrowdSize.y <= 1) { generateUMA = true; } else { generateLotsUMA = true; } }
static void ExportSelectionToSeparate() { for (int i = 0; i < Selection.gameObjects.Length; i++) { var selectedTransform = Selection.gameObjects[i].transform; var avatar = selectedTransform.GetComponent<UMAAvatarBase>(); while (avatar == null && selectedTransform.parent != null) { selectedTransform = selectedTransform.parent; avatar = selectedTransform.GetComponent<UMAAvatarBase>(); } if (avatar != null) { var path = EditorUtility.SaveFilePanel("Save obj static mesh", "Assets", avatar.name + ".obj", "obj"); if (path.Length != 0) { var staticMesh = new Mesh(); avatar.umaData.GetRenderer(0).BakeMesh(staticMesh); FileUtils.WriteAllText(path, MeshToString(staticMesh, avatar.umaData.GetRenderer(0).sharedMaterials)); UMAUtils.DestroySceneObject(staticMesh); } } } }
public static void SaveSelectedAvatarsTxt() { for (int i = 0; i < Selection.gameObjects.Length; i++) { var selectedTransform = Selection.gameObjects[i].transform; var avatar = selectedTransform.GetComponent <UMAAvatarBase>(); while (avatar == null && selectedTransform.parent != null) { selectedTransform = selectedTransform.parent; avatar = selectedTransform.GetComponent <UMAAvatarBase>(); } if (avatar != null) { var path = EditorUtility.SaveFilePanel("Save serialized Avatar", "Assets", avatar.name + ".txt", "txt"); if (path.Length != 0) { var asset = ScriptableObject.CreateInstance <UMATextRecipe>(); //check if Avatar is DCS if (avatar is UMA.CharacterSystem.DynamicCharacterAvatar) { asset.Save(avatar.umaData.umaRecipe, avatar.context, (avatar as DynamicCharacterAvatar).WardrobeRecipes, true); } else { asset.Save(avatar.umaData.umaRecipe, avatar.context); } System.IO.File.WriteAllText(path, asset.recipeString); UMAUtils.DestroySceneObject(asset); } } } }
/// <summary> /// Remove any controls from the panels /// </summary> private void Cleanup() { if (GeneralHelpText != null) { GeneralHelpText.SetActive(false); } if (DnaHelpText != null) { DnaHelpText.SetActive(false); } if (WardrobeHelpText != null) { WardrobeHelpText.SetActive(false); } if (ColorsHelpText != null) { ColorsHelpText.SetActive(false); } foreach (Transform t in SlotPanel.transform) { UMAUtils.DestroySceneObject(t.gameObject); } foreach (Transform t in WardrobePanel.transform) { UMAUtils.DestroySceneObject(t.gameObject); } }
public static void LoadSelectedAvatarsTxt() { for (int i = 0; i < Selection.gameObjects.Length; i++) { var selectedTransform = Selection.gameObjects[i].transform; var avatar = selectedTransform.GetComponent <UMAAvatarBase>(); while (avatar == null && selectedTransform.parent != null) { selectedTransform = selectedTransform.parent; avatar = selectedTransform.GetComponent <UMAAvatarBase>(); } if (avatar != null) { var path = EditorUtility.OpenFilePanel("Load serialized Avatar", "Assets", "txt"); if (path.Length != 0) { var asset = ScriptableObject.CreateInstance <UMATextRecipe>(); asset.recipeString = FileUtils.ReadAllText(path); //check if Avatar is DCS if (avatar is DynamicCharacterAvatar) { (avatar as DynamicCharacterAvatar).LoadFromRecipeString(asset.recipeString); } else { avatar.Load(asset); } UMAUtils.DestroySceneObject(asset); } } } }
private void Cleanup() { foreach (Transform t in ColorPanel.transform) { UMAUtils.DestroySceneObject(t.gameObject); } }
private void Cleanup() { foreach (Transform t in ColorPanel.transform) { UMAUtils.DestroySceneObject(t.gameObject); } colorButtonsController.ClearActiveButtons(); }
/// <summary> /// /// </summary> private void Cleanup() { if (SelectionPanel.transform.childCount > 0) { foreach (Transform t in SelectionPanel.transform) { UMAUtils.DestroySceneObject(t.gameObject); } } }
void umaData_OnCharacterUpdated(UMAData umaData) { var expressionPlayer = umaData.GetComponent <UMAExpressionPlayer>(); if (expressionPlayer.SlotUpdateVsCharacterUpdate-- == 0) { UMAUtils.DestroySceneObject(expressionPlayer); umaData.CharacterUpdated.RemoveListener(new UnityAction <UMAData>(umaData_OnCharacterUpdated)); return; } }
private void Cleanup() { foreach (Transform t in SlotPanel.transform) { UMAUtils.DestroySceneObject(t.gameObject); } foreach (Transform t in WardrobePanel.transform) { UMAUtils.DestroySceneObject(t.gameObject); } }
public void SelectNewBaseMesh() { if (forcedSlotBones) { UMAUtils.DestroySceneObject(SlotGO); SlotGO = Instantiate(slotAsset) as GameObject; SlotSMR = SlotGO.GetComponentInChildren <SkinnedMeshRenderer>(); forcedSlotBones = false; } UMAUtils.DestroySceneObject(RaceGO); SetPage(0); }
public void OnCharacterUpdate(UMA.UMAData data) { foreach (var componentName in removeComponentNames) { var component = data.animator.GetComponent(componentName); UMAUtils.DestroySceneObject(component); } foreach (var componentName in disableComponentNames) { var behavior = (data.animator.GetComponent(componentName) as Behaviour); if (behavior != null) { behavior.enabled = false; } } }
public void ReplaceAll() { if (generating) { Debug.LogWarning("Can't replace while generating."); return; } int childCount = gameObject.transform.childCount; while (--childCount >= 0) { Transform child = gameObject.transform.GetChild(childCount); UMAUtils.DestroySceneObject(child.gameObject); } generating = true; }
public void ButtonFemale() { UMAUtils.DestroySceneObject(GameObject.Find("UMACrowd").transform.GetChild(0).gameObject); crowdHandle.ResetSpawnPos(); GameObject myUma = crowdHandle.GenerateOneUMA(1); myUma.transform.localRotation = Quaternion.Euler(new Vector3(0, 180, 0)); GetUMAData(myUma); if (bodyArea != 0) { float yPos = GameObject.Find("NoseMiddle").transform.position.y; myCamera.transform.position = new Vector3(0, yPos + 0.05f, -0.62f); if (bodyArea == 2) { panel.Find("LowerHead/FacialHair").gameObject.SetActive(false); } } }
public void Initialize(DynamicCharacterAvatar Avatar) { foreach (GameObject go in CreatedObjects) { UMAUtils.DestroySceneObject(go); } CreatedObjects.Clear(); UMADnaBase[] DNA = Avatar.GetAllDNA(); List <DNAHolder> ValidDNA = new List <DNAHolder>(); foreach (UMADnaBase d in DNA) { string[] names = d.Names; float[] values = d.Values; for (int i = 0; i < names.Length; i++) { string name = names[i]; if (IsThisCategory(name.ToLower())) { ValidDNA.Add(new DNAHolder(name, values[i], i, d)); } } } ValidDNA.Sort( ); foreach (DNAHolder dna in ValidDNA) { GameObject go = GameObject.Instantiate(DnaEditor); go.transform.SetParent(ContentArea.transform); go.transform.localScale = new Vector3(1f, 1f, 1f); //Set the scale back to 1 DNAEditor de = go.GetComponentInChildren <DNAEditor>(); de.Initialize(dna.name.BreakupCamelCase(), dna.index, dna.dnaBase, Avatar, dna.value); go.SetActive(true); CreatedObjects.Add(go); } }
private void CreateBonePoseCallback(UMAData umaData) { UMA.PoseTools.UMABonePose bonePose = CreatePoseAsset("", bonePoseSaveName); //I dont think this should have ever overwritten the existing one /*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); } } UMAUtils.DestroySceneObject(tempAvatarPreDNA); UMAUtils.DestroySceneObject(tempAvatarPostDNA); // This can be very helpful for testing /* * bonePose.ApplyPose(skeletonPreDNA, 1.0f); */ EditorUtility.SetDirty(bonePose); AssetDatabase.SaveAssets(); if (_applyAndResetOnCreateBP) { DynamicDNAConverterController converterController = (selectedConverter is DynamicDNAConverterController) ? (selectedConverter as DynamicDNAConverterController) : null; DynamicDNAConverterBehaviour converterBehaviour = (selectedConverter is DynamicDNAConverterBehaviour) ? (selectedConverter as DynamicDNAConverterBehaviour) : null; //UMA2.8+ fixDNAPrefabs Removed the converterBehaviour.ConverterController field, it should be directly assigned to the Races/Slots now //if (converterBehaviour.ConverterController != null) // converterController = converterBehaviour.ConverterController; if (converterController != null) { //find the first BonePoseDNAConverterPlugin and add the pose to it var existingBPCPs = converterController.GetPlugins(typeof(BonePoseDNAConverterPlugin)); BonePoseDNAConverterPlugin thisBPCP; if (existingBPCPs.Count > 0) { thisBPCP = existingBPCPs[0] as BonePoseDNAConverterPlugin; //Turn off any other starting poses? for (int i = 0; i < existingBPCPs.Count; i++) { for (int bi = 0; bi < (existingBPCPs[i] as BonePoseDNAConverterPlugin).poseDNAConverters.Count; bi++) { (existingBPCPs[i] as BonePoseDNAConverterPlugin).poseDNAConverters[bi].startingPoseWeight = 0f; } } } else { //if there isn't one create it thisBPCP = converterController.AddPlugin(typeof(BonePoseDNAConverterPlugin)) as BonePoseDNAConverterPlugin; } thisBPCP.poseDNAConverters.Add(new BonePoseDNAConverterPlugin.BonePoseDNAConverter(bonePose, 1f)); Debug.Log(bonePose.name + " added as a starting pose to " + thisBPCP.name); } else if (converterBehaviour != null) { // Set this asset as the converters pose asset converterBehaviour.startingPose = bonePose; //make sure its fully applied converterBehaviour.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? Choose 'RemoveDNA' if your intention is to replace modifications made by a recipes starting DNA values with the created pose.", "Remove DNA", "Keep DNA")) { UMAData.UMARecipe baseRecipeData = new UMAData.UMARecipe(); baseRaceRecipe.Load(baseRecipeData, activeUMA.context); baseRecipeData.ClearDna(); baseRaceRecipe.Save(baseRecipeData, activeUMA.context); } } } }
// This code is generally the same as used in the DynamicDNAConverterCustomizer // Probably worth breaking it out at some point and having it geenric protected void CreateBonePoseCallback(UMAData umaData) { avatarDNAisDirty = false; UMABonePose bonePose = ScriptableObject.CreateInstance <UMABonePose>(); UMAData umaPreDNA = tempAvatarPreDNA.GetComponent <UMADynamicAvatar>().umaData; UMAData umaPostDNA = tempAvatarPostDNA.GetComponent <UMADynamicAvatar>().umaData; UMADnaBase activeDNA = umaPostDNA.umaRecipe.GetDna(selectedDNAHash); UMASkeleton skeletonPreDNA = umaPreDNA.skeleton; UMASkeleton skeletonPostDNA = umaPostDNA.skeleton; if (poseSaveIndex < 0) { poseSaveName = startingPoseName; // Now that StartingPose has been generated // add the active DNA to the pre DNA avatar // UMA2.8+ Lots of converters can use the same DNA now //UMA2.8+ FixDNAPrefabs raceData.GetConverter(s) now returns IDNAConverter([]) IDNAConverter[] activeConverters = sourceUMA.umaRecipe.raceData.GetConverters(sourceUMA.umaRecipe.GetDna(selectedDNAHash)); //umaPreDNA.umaRecipe.raceData.dnaConverterList = new DnaConverterBehaviour[1]; //umaPreDNA.umaRecipe.raceData.dnaConverterList[0] = activeConverter; umaPreDNA.umaRecipe.raceData.dnaConverterList = activeConverters; umaPreDNA.umaRecipe.raceData.UpdateDictionary(); umaPreDNA.umaRecipe.EnsureAllDNAPresent(); umaPreDNA.Dirty(true, false, true); } 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); } } int activeDNACount = activeDNA.Count; for (int i = 0; i < activeDNACount; i++) { activeDNA.SetValue(i, 0.5f); } AssetDatabase.CreateAsset(bonePose, folderPath + "/" + poseSaveName + ".asset"); EditorUtility.SetDirty(bonePose); AssetDatabase.SaveAssets(); poseSaveIndex++; if (poseSaveIndex < activeDNACount) { poseSaveName = activeDNA.Names[poseSaveIndex] + "_0"; activeDNA.SetValue(poseSaveIndex, 0.0f); avatarDNAisDirty = true; } else if (poseSaveIndex < (activeDNACount * 2)) { int dnaIndex = poseSaveIndex - activeDNACount; poseSaveName = activeDNA.Names[dnaIndex] + "_1"; activeDNA.SetValue(dnaIndex, 1.0f); umaPostDNA.Dirty(); avatarDNAisDirty = true; } else { UMAUtils.DestroySceneObject(tempAvatarPreDNA); UMAUtils.DestroySceneObject(tempAvatarPostDNA); // Build a prefab DNA Converter and populate it with the morph set string assetName = "Morph Set"; string assetPath = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + assetName + ".asset"); MorphSetDnaAsset asset = CustomAssetUtility.CreateAsset <MorphSetDnaAsset>(assetPath, false); SerializedObject serializedAsset = new SerializedObject(asset); SerializedProperty startingPose = serializedAsset.FindProperty("startingPose"); startingPose.objectReferenceValue = AssetDatabase.LoadAssetAtPath <UMABonePose>(folderPath + "/" + startingPoseName + ".asset"); SerializedProperty morphSetArray = serializedAsset.FindProperty("dnaMorphs"); morphSetArray.ClearArray(); for (int i = 0; i < activeDNACount; i++) { string posePairName = activeDNA.Names[i]; morphSetArray.InsertArrayElementAtIndex(i); SerializedProperty posePair = morphSetArray.GetArrayElementAtIndex(i); SerializedProperty dnaEntryName = posePair.FindPropertyRelative("dnaEntryName"); dnaEntryName.stringValue = posePairName; SerializedProperty zeroPose = posePair.FindPropertyRelative("poseZero"); zeroPose.objectReferenceValue = AssetDatabase.LoadAssetAtPath <UMABonePose>(folderPath + "/" + posePairName + "_0.asset"); SerializedProperty onePose = posePair.FindPropertyRelative("poseOne"); onePose.objectReferenceValue = AssetDatabase.LoadAssetAtPath <UMABonePose>(folderPath + "/" + posePairName + "_1.asset"); } serializedAsset.ApplyModifiedPropertiesWithoutUndo(); // Build a prefab DNA Converter and populate it with the morph set string prefabName = "Converter Prefab"; string prefabPath = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + prefabName + ".prefab"); GameObject tempConverterPrefab = new GameObject(prefabName); MorphSetDnaConverterBehaviour converter = tempConverterPrefab.AddComponent <MorphSetDnaConverterBehaviour>(); SerializedObject serializedConverter = new SerializedObject(converter); SerializedProperty morphSet = serializedAsset.FindProperty("morphSet"); morphSet.objectReferenceValue = AssetDatabase.LoadAssetAtPath <MorphSetDnaAsset>(assetPath); serializedConverter.ApplyModifiedPropertiesWithoutUndo(); #if UNITY_2018_3_OR_NEWER PrefabUtility.SaveAsPrefabAsset(tempConverterPrefab, prefabPath); #else PrefabUtility.CreatePrefab(prefabPath, tempConverterPrefab); #endif DestroyImmediate(tempConverterPrefab, false); } }
public void SelectNewSlotMesh() { forcedSlotBones = false; UMAUtils.DestroySceneObject(SlotGO); SetPage(1); }
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); } } UMAUtils.DestroySceneObject(tempAvatarPreDNA); UMAUtils.DestroySceneObject(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); } } }