/// <summary> /// Convert the target avatar for Quest. /// </summary> /// <param name="canOverwrite">Callback to check overwriting.</param> /// <param name="progressCallback">Callback to show progress.</param> /// <returns>Converted avatar's game object.</returns> internal GameObject ConvertAvatar(CanOverwriteCallback canOverwrite, AvatarConverter.ProgressCallback progressCallback) { if (AssetDatabase.IsValidFolder(outputPath)) { if (!canOverwrite()) { return(null); } } var undoGroup = Undo.GetCurrentGroup(); Undo.SetCurrentGroupName("Convert Avatar for Quest"); var(questAvatar, prefabName) = AvatarConverter.ConvertForQuest(TargetAvatar, outputPath, generateQuestTextures, (int)texturesSizeLimit, Remover, progressCallback); PrefabUtility.SaveAsPrefabAssetAndConnect(questAvatar.AvatarDescriptor.gameObject, prefabName, InteractionMode.UserAction); if (TargetAvatarDescriptor.gameObject.activeInHierarchy) { Undo.RecordObject(TargetAvatarDescriptor.gameObject, "Disable original avatar"); TargetAvatarDescriptor.gameObject.SetActive(false); } Undo.CollapseUndoOperations(undoGroup); return(questAvatar.AvatarDescriptor.gameObject); }
private void OnEnable() { titleContent.text = "Convert Avatar for Quest"; progressCallback = new AvatarConverter.ProgressCallback { onTextureProgress = (total, index, exception, material) => { var i18n = VRCQuestToolsSettings.I18nResource; if (exception != null) { var message = $"{i18n.MaterialExceptionDialogMessage}\n" + "\n" + $"Material: {AssetDatabase.GetAssetPath(material)}\n" + $"Shader: {material.shader.name}\n" + "\n" + $"Exception: {exception.Message}"; EditorUtility.DisplayDialog(VRCQuestTools.Name, message, "OK"); EditorUtility.ClearProgressBar(); } else { var progress = (float)index / total; EditorUtility.DisplayProgressBar(VRCQuestTools.Name, $"{i18n.GeneratingTexturesDialogMessage} : {index + 1}/{total}", progress); } }, onAnimationClipProgress = (total, index, exception, clip) => { var i18n = VRCQuestToolsSettings.I18nResource; if (exception != null) { var message = $"{i18n.AnimationClipExceptionDialogMessage}\n" + $"\n" + $"AnimationClip: {clip.name}\n" + $"\n" + $"Exception: {exception.Message}"; EditorUtility.DisplayDialog(VRCQuestTools.Name, message, "OK"); EditorUtility.ClearProgressBar(); } else { var progress = (float)index / total; EditorUtility.DisplayProgressBar(VRCQuestTools.Name, $"Converting AnimationCilps : {index}/{total}", progress); } }, onRuntimeAnimatorProgress = (total, index, exception, controller) => { var i18n = VRCQuestToolsSettings.I18nResource; if (exception != null) { var message = $"{i18n.AnimatorControllerExceptionDialogMessage}\n" + $"\n" + $"AnimatorController: {controller.name}\n" + $"\n" + $"Exception: {exception.Message}"; EditorUtility.DisplayDialog(VRCQuestTools.Name, message, "OK"); EditorUtility.ClearProgressBar(); } else { var progress = (float)index / total; EditorUtility.DisplayProgressBar(VRCQuestTools.Name, $"Converting AnimatorControllers : {index + 1}/{total}", progress); } }, }; model.AvatarConverter = VRCQuestTools.AvatarConverter; }