From f9f2b6f8ac5220068c3ec68d66f53e1cb1b981f2 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 14 Mar 2019 15:03:33 -0700 Subject: [PATCH] avatar exporter 0.3.4/0.3.5 changes to master --- .../{ => AvatarExporter}/AvatarExporter.cs | 767 ++++++--- .../Assets/Editor/AvatarExporter/Average.mat | 76 + .../Assets/Editor/AvatarExporter/Floor.mat | 76 + .../AvatarExporter/HeightReference.prefab | 1393 +++++++++++++++++ .../Assets/Editor/AvatarExporter/Line.mat | 76 + .../Editor/AvatarExporter/ShortOrTall.mat | 76 + .../Editor/AvatarExporter/TooShortOrTall.mat | 76 + tools/unity-avatar-exporter/Assets/README.txt | 13 +- .../avatarExporter.unitypackage | Bin 16045 -> 74582 bytes 9 files changed, 2296 insertions(+), 257 deletions(-) rename tools/unity-avatar-exporter/Assets/Editor/{ => AvatarExporter}/AvatarExporter.cs (67%) create mode 100644 tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Average.mat create mode 100644 tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Floor.mat create mode 100644 tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/HeightReference.prefab create mode 100644 tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Line.mat create mode 100644 tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/ShortOrTall.mat create mode 100644 tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/TooShortOrTall.mat diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/AvatarExporter.cs similarity index 67% rename from tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs rename to tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/AvatarExporter.cs index c25a962824..142e4ae35a 100644 --- a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/AvatarExporter.cs @@ -6,15 +6,18 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -using UnityEngine; using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; using System; -using System.IO; using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; class AvatarExporter : MonoBehaviour { // update version number for every PR that changes this file, also set updated version in README file - static readonly string AVATAR_EXPORTER_VERSION = "0.3.3"; + static readonly string AVATAR_EXPORTER_VERSION = "0.3.5"; static readonly float HIPS_GROUND_MIN_Y = 0.01f; static readonly float HIPS_SPINE_CHEST_MIN_SEPARATION = 0.001f; @@ -22,6 +25,9 @@ class AvatarExporter : MonoBehaviour { static readonly string EMPTY_WARNING_TEXT = "None"; static readonly string TEXTURES_DIRECTORY = "textures"; static readonly string DEFAULT_MATERIAL_NAME = "No Name"; + static readonly string HEIGHT_REFERENCE_PREFAB = "Assets/Editor/AvatarExporter/HeightReference.prefab"; + static readonly Vector3 PREVIEW_CAMERA_PIVOT = new Vector3(0.0f, 1.755f, 0.0f); + static readonly Vector3 PREVIEW_CAMERA_DIRECTION = new Vector3(0.0f, 0.0f, -1.0f); // TODO: use regex static readonly string[] RECOMMENDED_UNITY_VERSIONS = new string[] { @@ -298,18 +304,17 @@ class AvatarExporter : MonoBehaviour { if (!string.IsNullOrEmpty(occlusionMap)) { json += "\"occlusionMap\": \"" + occlusionMap + "\", "; } - json += "\"emissive\": [" + emissive.r + ", " + emissive.g + ", " + emissive.b + "] "; + json += "\"emissive\": [" + emissive.r + ", " + emissive.g + ", " + emissive.b + "]"; if (!string.IsNullOrEmpty(emissiveMap)) { - json += "\", emissiveMap\": \"" + emissiveMap + "\""; + json += ", \"emissiveMap\": \"" + emissiveMap + "\""; } - json += "} }"; + json += " } }"; return json; } } static string assetPath = ""; - static string assetName = ""; - + static string assetName = ""; static ModelImporter modelImporter; static HumanDescription humanDescription; @@ -317,12 +322,23 @@ class AvatarExporter : MonoBehaviour { static Dictionary humanoidToUserBoneMappings = new Dictionary(); static BoneTreeNode userBoneTree = new BoneTreeNode(); static Dictionary failedAvatarRules = new Dictionary(); + static string warnings = ""; static Dictionary textureDependencies = new Dictionary(); static Dictionary materialMappings = new Dictionary(); static Dictionary materialDatas = new Dictionary(); - static List materialAlternateStandardShader = new List(); - static Dictionary materialUnsupportedShader = new Dictionary(); + static List alternateStandardShaderMaterials = new List(); + static List unsupportedShaderMaterials = new List(); + + static Scene previewScene; + static string previousScene = ""; + static Vector3 previousScenePivot = Vector3.zero; + static Quaternion previousSceneRotation = Quaternion.identity; + static float previousSceneSize = 0.0f; + static bool previousSceneOrthographic = false; + static UnityEngine.Object avatarResource; + static GameObject avatarPreviewObject; + static GameObject heightReferenceObject; [MenuItem("High Fidelity/Export New Avatar")] static void ExportNewAvatar() { @@ -339,8 +355,8 @@ class AvatarExporter : MonoBehaviour { EditorUtility.DisplayDialog("About", "High Fidelity, Inc.\nAvatar Exporter\nVersion " + AVATAR_EXPORTER_VERSION, "Ok"); } - static void ExportSelectedAvatar(bool updateAvatar) { - // ensure everything is saved to file before exporting + static void ExportSelectedAvatar(bool updateExistingAvatar) { + // ensure everything is saved to file before doing anything AssetDatabase.SaveAssets(); string[] guids = Selection.assetGUIDs; @@ -364,6 +380,11 @@ class AvatarExporter : MonoBehaviour { " the Rig section of it's Inspector window.", "Ok"); return; } + + avatarResource = AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object)); + humanDescription = modelImporter.humanDescription; + + string textureWarnings = SetTextureDependencies(); // if the rig is optimized we should de-optimize it during the export process bool shouldDeoptimizeGameObjects = modelImporter.optimizeGameObjects; @@ -371,28 +392,23 @@ class AvatarExporter : MonoBehaviour { modelImporter.optimizeGameObjects = false; modelImporter.SaveAndReimport(); } - - humanDescription = modelImporter.humanDescription; - string textureWarnings = SetTextureDependencies(); + SetBoneAndMaterialInformation(); + if (shouldDeoptimizeGameObjects) { + // switch back to optimized game object in case it was originally optimized + modelImporter.optimizeGameObjects = true; + modelImporter.SaveAndReimport(); + } + // check if we should be substituting a bone for a missing UpperChest mapping AdjustUpperChestMapping(); // format resulting avatar rule failure strings // consider export-blocking avatar rules to be errors and show them in an error dialog, // and also include any other avatar rule failures plus texture warnings as warnings in the dialog - if (shouldDeoptimizeGameObjects) { - // switch back to optimized game object in case it was originally optimized - modelImporter.optimizeGameObjects = true; - modelImporter.SaveAndReimport(); - } - - // format resulting bone rule failure strings - // consider export-blocking bone rules to be errors and show them in an error dialog, - // and also include any other bone rule failures plus texture warnings as warnings in the dialog string boneErrors = ""; - string warnings = ""; + warnings = ""; foreach (var failedAvatarRule in failedAvatarRules) { if (Array.IndexOf(EXPORT_BLOCKING_AVATAR_RULES, failedAvatarRule.Key) >= 0) { boneErrors += failedAvatarRule.Value + "\n\n"; @@ -400,15 +416,16 @@ class AvatarExporter : MonoBehaviour { warnings += failedAvatarRule.Value + "\n\n"; } } - foreach (string materialName in materialAlternateStandardShader) { - warnings += "The material " + materialName + " is not using the recommended variation of the Standard shader. " + - "We recommend you change it to Standard (Roughness setup) shader for improved performance.\n\n"; - } - foreach (var material in materialUnsupportedShader) { - warnings += "The material " + material.Key + " is using an unsupported shader " + material.Value + - ". Please change it to a Standard shader type.\n\n"; - } + + // add material and texture warnings after bone-related warnings + AddMaterialWarnings(); warnings += textureWarnings; + + // remove trailing newlines at the end of the warnings + if (!string.IsNullOrEmpty(warnings)) { + warnings = warnings.Substring(0, warnings.LastIndexOf("\n\n")); + } + if (!string.IsNullOrEmpty(boneErrors)) { // if there are both errors and warnings then warnings will be displayed with errors in the error dialog if (!string.IsNullOrEmpty(warnings)) { @@ -421,150 +438,157 @@ class AvatarExporter : MonoBehaviour { return; } + // since there are no errors we can now open the preview scene in place of the user's scene + if (!OpenPreviewScene()) { + return; + } + + // show None instead of blank warnings if there are no warnings in the export windows + if (string.IsNullOrEmpty(warnings)) { + warnings = EMPTY_WARNING_TEXT; + } + string documentsFolder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments); string hifiFolder = documentsFolder + "\\High Fidelity Projects"; - if (updateAvatar) { // Update Existing Avatar menu option - bool copyModelToExport = false; + if (updateExistingAvatar) { // Update Existing Avatar menu option + // open update existing project popup window including project to update, scale, and warnings + // default the initial file chooser location to HiFi projects folder in user documents folder + ExportProjectWindow window = ScriptableObject.CreateInstance(); string initialPath = Directory.Exists(hifiFolder) ? hifiFolder : documentsFolder; - - // open file explorer defaulting to hifi projects folder in user documents to select target fst to update - string exportFstPath = EditorUtility.OpenFilePanel("Select .fst to update", initialPath, "fst"); - if (exportFstPath.Length == 0) { // file selection cancelled - return; - } - exportFstPath = exportFstPath.Replace('/', '\\'); - - // lookup the project name field from the fst file to update - string projectName = ""; - try { - string[] lines = File.ReadAllLines(exportFstPath); - foreach (string line in lines) { - int separatorIndex = line.IndexOf("="); - if (separatorIndex >= 0) { - string key = line.Substring(0, separatorIndex).Trim(); - if (key == "name") { - projectName = line.Substring(separatorIndex + 1).Trim(); - break; - } - } - } - } catch { - EditorUtility.DisplayDialog("Error", "Failed to read from existing file " + exportFstPath + - ". Please check the file and try again.", "Ok"); - return; - } - - string exportModelPath = Path.GetDirectoryName(exportFstPath) + "\\" + assetName + ".fbx"; - if (File.Exists(exportModelPath)) { - // if the fbx in Unity Assets is newer than the fbx in the target export - // folder or vice-versa then ask to replace the older fbx with the newer fbx - DateTime assetModelWriteTime = File.GetLastWriteTime(assetPath); - DateTime targetModelWriteTime = File.GetLastWriteTime(exportModelPath); - if (assetModelWriteTime > targetModelWriteTime) { - int option = EditorUtility.DisplayDialogComplex("Error", "The " + assetName + - ".fbx model in the Unity Assets folder is newer than the " + exportModelPath + - " model.\n\nDo you want to replace the older .fbx with the newer .fbx?", - "Yes", "No", "Cancel"); - if (option == 2) { // Cancel - return; - } - copyModelToExport = option == 0; // Yes - } else if (assetModelWriteTime < targetModelWriteTime) { - int option = EditorUtility.DisplayDialogComplex("Error", "The " + exportModelPath + - " model is newer than the " + assetName + ".fbx model in the Unity Assets folder." + - "\n\nDo you want to replace the older .fbx with the newer .fbx and re-import it?", - "Yes", "No" , "Cancel"); - if (option == 2) { // Cancel - return; - } else if (option == 0) { // Yes - copy model to Unity project - // copy the fbx from the project folder to Unity Assets, overwriting the existing fbx, and re-import it - try { - File.Copy(exportModelPath, assetPath, true); - } catch { - EditorUtility.DisplayDialog("Error", "Failed to copy existing file " + exportModelPath + " to " + assetPath + - ". Please check the location and try again.", "Ok"); - return; - } - AssetDatabase.ImportAsset(assetPath); - - // set model to Humanoid animation type and force another refresh on it to process Humanoid - modelImporter = ModelImporter.GetAtPath(assetPath) as ModelImporter; - modelImporter.animationType = ModelImporterAnimationType.Human; - EditorUtility.SetDirty(modelImporter); - modelImporter.SaveAndReimport(); - - // redo parent names, joint mappings, and user bone positions due to the fbx change - // as well as re-check the avatar rules for failures - humanDescription = modelImporter.humanDescription; - SetBoneAndMaterialInformation(); - } - } - } else { - // if no matching fbx exists in the target export folder then ask to copy fbx over - int option = EditorUtility.DisplayDialogComplex("Error", "There is no existing " + exportModelPath + - " model.\n\nDo you want to copy over the " + assetName + - ".fbx model from the Unity Assets folder?", "Yes", "No", "Cancel"); - if (option == 2) { // Cancel - return; - } - copyModelToExport = option == 0; // Yes - } - - // copy asset fbx over deleting any existing fbx if we agreed to overwrite it - if (copyModelToExport) { - try { - File.Copy(assetPath, exportModelPath, true); - } catch { - EditorUtility.DisplayDialog("Error", "Failed to copy existing file " + assetPath + " to " + exportModelPath + - ". Please check the location and try again.", "Ok"); - return; - } - } - - // delete existing fst file since we will write a new file - // TODO: updating fst should only rewrite joint mappings and joint rotation offsets to existing file - try { - File.Delete(exportFstPath); - } catch { - EditorUtility.DisplayDialog("Error", "Failed to overwrite existing file " + exportFstPath + - ". Please check the file and try again.", "Ok"); - return; - } - - // write out a new fst file in place of the old file - if (!WriteFST(exportFstPath, projectName)) { - return; - } - - // copy any external texture files to the project's texture directory that are considered dependencies of the model - string texturesDirectory = GetTextureDirectory(exportFstPath); - if (!CopyExternalTextures(texturesDirectory)) { - return; - } - - // display success dialog with any avatar rule warnings - string successDialog = "Avatar successfully updated!"; - if (!string.IsNullOrEmpty(warnings)) { - successDialog += "\n\nWarnings:\n" + warnings; - } - EditorUtility.DisplayDialog("Success!", successDialog, "Ok"); + window.Init(initialPath, warnings, updateExistingAvatar, avatarPreviewObject, OnUpdateExistingProject, OnExportWindowClose); } else { // Export New Avatar menu option // create High Fidelity Projects folder in user documents folder if it doesn't exist if (!Directory.Exists(hifiFolder)) { Directory.CreateDirectory(hifiFolder); } - if (string.IsNullOrEmpty(warnings)) { - warnings = EMPTY_WARNING_TEXT; - } - - // open a popup window to enter new export project name and project location + // open export new project popup window including project name, project location, scale, and warnings + // default the initial project location path to the High Fidelity Projects folder above ExportProjectWindow window = ScriptableObject.CreateInstance(); - window.Init(hifiFolder, warnings, OnExportProjectWindowClose); + window.Init(hifiFolder, warnings, updateExistingAvatar, avatarPreviewObject, OnExportNewProject, OnExportWindowClose); } } - static void OnExportProjectWindowClose(string projectDirectory, string projectName, string warnings) { + static void OnUpdateExistingProject(string exportFstPath, string projectName, float scale) { + bool copyModelToExport = false; + + // lookup the project name field from the fst file to update + projectName = ""; + try { + string[] lines = File.ReadAllLines(exportFstPath); + foreach (string line in lines) { + int separatorIndex = line.IndexOf("="); + if (separatorIndex >= 0) { + string key = line.Substring(0, separatorIndex).Trim(); + if (key == "name") { + projectName = line.Substring(separatorIndex + 1).Trim(); + break; + } + } + } + } catch { + EditorUtility.DisplayDialog("Error", "Failed to read from existing file " + exportFstPath + + ". Please check the file and try again.", "Ok"); + return; + } + + string exportModelPath = Path.GetDirectoryName(exportFstPath) + "\\" + assetName + ".fbx"; + if (File.Exists(exportModelPath)) { + // if the fbx in Unity Assets is newer than the fbx in the target export + // folder or vice-versa then ask to replace the older fbx with the newer fbx + DateTime assetModelWriteTime = File.GetLastWriteTime(assetPath); + DateTime targetModelWriteTime = File.GetLastWriteTime(exportModelPath); + if (assetModelWriteTime > targetModelWriteTime) { + int option = EditorUtility.DisplayDialogComplex("Error", "The " + assetName + + ".fbx model in the Unity Assets folder is newer than the " + exportModelPath + + " model.\n\nDo you want to replace the older .fbx with the newer .fbx?", + "Yes", "No", "Cancel"); + if (option == 2) { // Cancel + return; + } + copyModelToExport = option == 0; // Yes + } else if (assetModelWriteTime < targetModelWriteTime) { + int option = EditorUtility.DisplayDialogComplex("Error", "The " + exportModelPath + + " model is newer than the " + assetName + ".fbx model in the Unity Assets folder." + + "\n\nDo you want to replace the older .fbx with the newer .fbx and re-import it?", + "Yes", "No" , "Cancel"); + if (option == 2) { // Cancel + return; + } else if (option == 0) { // Yes - copy model to Unity project + // copy the fbx from the project folder to Unity Assets, overwriting the existing fbx, and re-import it + try { + File.Copy(exportModelPath, assetPath, true); + } catch { + EditorUtility.DisplayDialog("Error", "Failed to copy existing file " + exportModelPath + " to " + assetPath + + ". Please check the location and try again.", "Ok"); + return; + } + AssetDatabase.ImportAsset(assetPath); + + // set model to Humanoid animation type and force another refresh on it to process Humanoid + modelImporter = ModelImporter.GetAtPath(assetPath) as ModelImporter; + modelImporter.animationType = ModelImporterAnimationType.Human; + EditorUtility.SetDirty(modelImporter); + modelImporter.SaveAndReimport(); + + // redo parent names, joint mappings, and user bone positions due to the fbx change + // as well as re-check the avatar rules for failures + humanDescription = modelImporter.humanDescription; + SetBoneAndMaterialInformation(); + } + } + } else { + // if no matching fbx exists in the target export folder then ask to copy fbx over + int option = EditorUtility.DisplayDialogComplex("Error", "There is no existing " + exportModelPath + + " model.\n\nDo you want to copy over the " + assetName + + ".fbx model from the Unity Assets folder?", "Yes", "No", "Cancel"); + if (option == 2) { // Cancel + return; + } + copyModelToExport = option == 0; // Yes + } + + // copy asset fbx over deleting any existing fbx if we agreed to overwrite it + if (copyModelToExport) { + try { + File.Copy(assetPath, exportModelPath, true); + } catch { + EditorUtility.DisplayDialog("Error", "Failed to copy existing file " + assetPath + " to " + exportModelPath + + ". Please check the location and try again.", "Ok"); + return; + } + } + + // delete existing fst file since we will write a new file + // TODO: updating fst should only rewrite joint mappings and joint rotation offsets to existing file + try { + File.Delete(exportFstPath); + } catch { + EditorUtility.DisplayDialog("Error", "Failed to overwrite existing file " + exportFstPath + + ". Please check the file and try again.", "Ok"); + return; + } + + // write out a new fst file in place of the old file + if (!WriteFST(exportFstPath, projectName, scale)) { + return; + } + + // copy any external texture files to the project's texture directory that are considered dependencies of the model + string texturesDirectory = GetTextureDirectory(exportFstPath); + if (!CopyExternalTextures(texturesDirectory)) { + return; + } + + // display success dialog with any avatar rule warnings + string successDialog = "Avatar successfully updated!"; + if (!string.IsNullOrEmpty(warnings)) { + successDialog += "\n\nWarnings:\n" + warnings; + } + EditorUtility.DisplayDialog("Success!", successDialog, "Ok"); + } + + static void OnExportNewProject(string projectDirectory, string projectName, float scale) { // copy the fbx from the Unity Assets folder to the project directory string exportModelPath = projectDirectory + assetName + ".fbx"; File.Copy(assetPath, exportModelPath); @@ -577,7 +601,7 @@ class AvatarExporter : MonoBehaviour { // write out the avatar.fst file to the project directory string exportFstPath = projectDirectory + "avatar.fst"; - if (!WriteFST(exportFstPath, projectName)) { + if (!WriteFST(exportFstPath, projectName, scale)) { return; } @@ -592,16 +616,27 @@ class AvatarExporter : MonoBehaviour { if (warnings != EMPTY_WARNING_TEXT) { successDialog += "Warnings:\n" + warnings; } - successDialog += "Note: If you are using any external textures with your model, " + + successDialog += "\n\nNote: If you are using any external textures with your model, " + "please ensure those textures are copied to " + texturesDirectory; EditorUtility.DisplayDialog("Success!", successDialog, "Ok"); } + + static void OnExportWindowClose() { + // close the preview avatar scene and go back to user's previous scene when export project windows close + ClosePreviewScene(); + } - static bool WriteFST(string exportFstPath, string projectName) { + // The High Fidelity FBX Serializer omits the colon based prefixes. This will make the jointnames compatible. + static string removeTypeFromJointname(string jointName) { + return jointName.Substring(jointName.IndexOf(':') + 1); + } + + static bool WriteFST(string exportFstPath, string projectName, float scale) { // write out core fields to top of fst file try { - File.WriteAllText(exportFstPath, "name = " + projectName + "\ntype = body+head\nscale = 1\nfilename = " + - assetName + ".fbx\n" + "texdir = textures\n"); + File.WriteAllText(exportFstPath, "exporterVersion = " + AVATAR_EXPORTER_VERSION + "\nname = " + projectName + + "\ntype = body+head\nscale = " + scale + "\nfilename = " + assetName + + ".fbx\n" + "texdir = textures\n"); } catch { EditorUtility.DisplayDialog("Error", "Failed to write file " + exportFstPath + ". Please check the location and try again.", "Ok"); @@ -612,7 +647,7 @@ class AvatarExporter : MonoBehaviour { foreach (var userBoneInfo in userBoneInfos) { if (userBoneInfo.Value.HasHumanMapping()) { string hifiJointName = HUMANOID_TO_HIFI_JOINT_NAME[userBoneInfo.Value.humanName]; - File.AppendAllText(exportFstPath, "jointMap = " + hifiJointName + " = " + userBoneInfo.Key + "\n"); + File.AppendAllText(exportFstPath, "jointMap = " + hifiJointName + " = " + removeTypeFromJointname(userBoneInfo.Key) + "\n"); } } @@ -653,7 +688,7 @@ class AvatarExporter : MonoBehaviour { // swap from left-handed (Unity) to right-handed (HiFi) coordinates and write out joint rotation offset to fst jointOffset = new Quaternion(-jointOffset.x, jointOffset.y, jointOffset.z, -jointOffset.w); - File.AppendAllText(exportFstPath, "jointRotationOffset2 = " + userBoneName + " = (" + jointOffset.x + ", " + + File.AppendAllText(exportFstPath, "jointRotationOffset2 = " + removeTypeFromJointname(userBoneName) + " = (" + jointOffset.x + ", " + jointOffset.y + ", " + jointOffset.z + ", " + jointOffset.w + ")\n"); } @@ -690,14 +725,13 @@ class AvatarExporter : MonoBehaviour { userBoneTree = new BoneTreeNode(); materialDatas.Clear(); - materialAlternateStandardShader.Clear(); - materialUnsupportedShader.Clear(); - + alternateStandardShaderMaterials.Clear(); + unsupportedShaderMaterials.Clear(); + SetMaterialMappings(); - - // instantiate a game object of the user avatar to traverse the bone tree to gather - // bone parents and positions as well as build a bone tree, then destroy it - UnityEngine.Object avatarResource = AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object)); + + // instantiate a game object of the user avatar to traverse the bone tree to gather + // bone parents and positions as well as build a bone tree, then destroy it GameObject assetGameObject = (GameObject)Instantiate(avatarResource); TraverseUserBoneTree(assetGameObject.transform); DestroyImmediate(assetGameObject); @@ -732,8 +766,8 @@ class AvatarExporter : MonoBehaviour { bool light = gameObject.GetComponent() != null; bool camera = gameObject.GetComponent() != null; - // if this is a mesh and the model is using external materials then store its material data to be exported - if (mesh && modelImporter.materialLocation == ModelImporterMaterialLocation.External) { + // if this is a mesh then store its material data to be exported if the material is mapped to an fbx material name + if (mesh) { Material[] materials = skinnedMeshRenderer != null ? skinnedMeshRenderer.sharedMaterials : meshRenderer.sharedMaterials; StoreMaterialData(materials); } else if (!light && !camera) { @@ -959,7 +993,8 @@ class AvatarExporter : MonoBehaviour { string userBoneName = ""; // avatar rule fails if bone is not mapped in Humanoid if (!humanoidToUserBoneMappings.TryGetValue(humanBoneName, out userBoneName)) { - failedAvatarRules.Add(avatarRule, "There is no " + humanBoneName + " bone mapped in Humanoid for the selected avatar."); + failedAvatarRules.Add(avatarRule, "There is no " + humanBoneName + + " bone mapped in Humanoid for the selected avatar."); } return userBoneName; } @@ -1072,11 +1107,11 @@ class AvatarExporter : MonoBehaviour { // don't store any material data for unsupported shader types if (Array.IndexOf(SUPPORTED_SHADERS, shaderName) == -1) { - if (!materialUnsupportedShader.ContainsKey(materialName)) { - materialUnsupportedShader.Add(materialName, shaderName); + if (!unsupportedShaderMaterials.Contains(materialName)) { + unsupportedShaderMaterials.Add(materialName); } continue; - } + } MaterialData materialData = new MaterialData(); materialData.albedo = material.GetColor("_Color"); @@ -1100,18 +1135,19 @@ class AvatarExporter : MonoBehaviour { // for non-roughness Standard shaders give a warning that is not the recommended Standard shader, // and invert smoothness for roughness if (shaderName == STANDARD_SHADER || shaderName == STANDARD_SPECULAR_SHADER) { - if (!materialAlternateStandardShader.Contains(materialName)) { - materialAlternateStandardShader.Add(materialName); + if (!alternateStandardShaderMaterials.Contains(materialName)) { + alternateStandardShaderMaterials.Add(materialName); } materialData.roughness = 1.0f - materialData.roughness; } - - // remap the material name from the Unity material name to the fbx material name that it overrides - if (materialMappings.ContainsKey(materialName)) { - materialName = materialMappings[materialName]; - } - if (!materialDatas.ContainsKey(materialName)) { - materialDatas.Add(materialName, materialData); + + // store the material data under each fbx material name that it overrides from the material mapping + foreach (var materialMapping in materialMappings) { + string fbxMaterialName = materialMapping.Key; + string unityMaterialName = materialMapping.Value; + if (unityMaterialName == materialName && !materialDatas.ContainsKey(fbxMaterialName)) { + materialDatas.Add(fbxMaterialName, materialData); + } } } } @@ -1136,20 +1172,110 @@ class AvatarExporter : MonoBehaviour { static void SetMaterialMappings() { materialMappings.Clear(); - // store the mappings from fbx material name to the Unity material name overriding it using external fbx mapping + // store the mappings from fbx material name to the Unity Material name that overrides it using external fbx mapping var objectMap = modelImporter.GetExternalObjectMap(); foreach (var mapping in objectMap) { var material = mapping.Value as UnityEngine.Material; if (material != null) { - materialMappings.Add(material.name, mapping.Key.name); + materialMappings.Add(mapping.Key.name, material.name); } } } + + static void AddMaterialWarnings() { + string alternateStandardShaders = ""; + string unsupportedShaders = ""; + // combine all material names for each material warning into a comma-separated string + foreach (string materialName in alternateStandardShaderMaterials) { + if (!string.IsNullOrEmpty(alternateStandardShaders)) { + alternateStandardShaders += ", "; + } + alternateStandardShaders += materialName; + } + foreach (string materialName in unsupportedShaderMaterials) { + if (!string.IsNullOrEmpty(unsupportedShaders)) { + unsupportedShaders += ", "; + } + unsupportedShaders += materialName; + } + if (alternateStandardShaderMaterials.Count > 1) { + warnings += "The materials " + alternateStandardShaders + " are not using the " + + "recommended variation of the Standard shader. We recommend you change " + + "them to Standard (Roughness setup) shader for improved performance.\n\n"; + } else if (alternateStandardShaderMaterials.Count == 1) { + warnings += "The material " + alternateStandardShaders + " is not using the " + + "recommended variation of the Standard shader. We recommend you change " + + "it to Standard (Roughness setup) shader for improved performance.\n\n"; + } + if (unsupportedShaderMaterials.Count > 1) { + warnings += "The materials " + unsupportedShaders + " are using an unsupported shader. " + + "Please change them to a Standard shader type.\n\n"; + } else if (unsupportedShaderMaterials.Count == 1) { + warnings += "The material " + unsupportedShaders + " is using an unsupported shader. " + + "Please change it to a Standard shader type.\n\n"; + } + } + + static bool OpenPreviewScene() { + // see if the user wants to save their current scene before opening preview avatar scene in place of user's scene + if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) { + return false; + } + + // store the user's current scene to re-open when done and open a new default scene in place of the user's scene + previousScene = EditorSceneManager.GetActiveScene().path; + previewScene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene); + + // instantiate a game object to preview the avatar and a game object for the height reference prefab at 0, 0, 0 + UnityEngine.Object heightReferenceResource = AssetDatabase.LoadAssetAtPath(HEIGHT_REFERENCE_PREFAB, typeof(UnityEngine.Object)); + avatarPreviewObject = (GameObject)Instantiate(avatarResource, Vector3.zero, Quaternion.identity); + heightReferenceObject = (GameObject)Instantiate(heightReferenceResource, Vector3.zero, Quaternion.identity); + + // store the camera pivot and rotation from the user's last scene to be restored later + // replace the camera pivot and rotation to point at the preview avatar object in the -Z direction (facing front of it) + var sceneView = SceneView.lastActiveSceneView; + if (sceneView != null) { + previousScenePivot = sceneView.pivot; + previousSceneRotation = sceneView.rotation; + previousSceneSize = sceneView.size; + previousSceneOrthographic = sceneView.orthographic; + sceneView.pivot = PREVIEW_CAMERA_PIVOT; + sceneView.rotation = Quaternion.LookRotation(PREVIEW_CAMERA_DIRECTION); + sceneView.orthographic = true; + sceneView.size = 5.0f; + } + + return true; + } + + static void ClosePreviewScene() { + // destroy the avatar and height reference game objects closing the scene + DestroyImmediate(avatarPreviewObject); + DestroyImmediate(heightReferenceObject); + + // re-open the scene the user had open before switching to the preview scene + if (!string.IsNullOrEmpty(previousScene)) { + EditorSceneManager.OpenScene(previousScene); + } + + // close the preview scene and flag it to be removed + EditorSceneManager.CloseScene(previewScene, true); + + // restore the camera pivot and rotation to the user's previous scene settings + var sceneView = SceneView.lastActiveSceneView; + if (sceneView != null) { + sceneView.pivot = previousScenePivot; + sceneView.rotation = previousSceneRotation; + sceneView.size = previousSceneSize; + sceneView.orthographic = previousSceneOrthographic; + } + } } class ExportProjectWindow : EditorWindow { const int WINDOW_WIDTH = 500; - const int WINDOW_HEIGHT = 460; + const int EXPORT_NEW_WINDOW_HEIGHT = 520; + const int UPDATE_EXISTING_WINDOW_HEIGHT = 465; const int BUTTON_FONT_SIZE = 16; const int LABEL_FONT_SIZE = 16; const int TEXT_FIELD_FONT_SIZE = 14; @@ -1157,28 +1283,62 @@ class ExportProjectWindow : EditorWindow { const int ERROR_FONT_SIZE = 12; const int WARNING_SCROLL_HEIGHT = 170; const string EMPTY_ERROR_TEXT = "None\n"; - + const int SLIDER_WIDTH = 340; + const int SCALE_TEXT_WIDTH = 60; + const float MIN_SCALE_SLIDER = 0.0f; + const float MAX_SCALE_SLIDER = 2.0f; + const int SLIDER_SCALE_EXPONENT = 10; + const float ACTUAL_SCALE_OFFSET = 1.0f; + const float DEFAULT_AVATAR_HEIGHT = 1.755f; + const float MAXIMUM_RECOMMENDED_HEIGHT = DEFAULT_AVATAR_HEIGHT * 1.5f; + const float MINIMUM_RECOMMENDED_HEIGHT = DEFAULT_AVATAR_HEIGHT * 0.25f; + readonly Color COLOR_YELLOW = Color.yellow; //new Color(0.9176f, 0.8274f, 0.0f); + readonly Color COLOR_BACKGROUND = new Color(0.5f, 0.5f, 0.5f); + + GameObject avatarPreviewObject; + bool updateExistingAvatar = false; string projectName = ""; string projectLocation = ""; + string initialProjectLocation = ""; string projectDirectory = ""; string errorText = EMPTY_ERROR_TEXT; - string warningText = ""; + string warningText = "\n"; Vector2 warningScrollPosition = new Vector2(0, 0); + string scaleWarningText = ""; + float sliderScale = 0.30103f; - public delegate void OnCloseDelegate(string projectDirectory, string projectName, string warnings); + public delegate void OnExportDelegate(string projectDirectory, string projectName, float scale); + OnExportDelegate onExportCallback; + + public delegate void OnCloseDelegate(); OnCloseDelegate onCloseCallback; - public void Init(string initialPath, string warnings, OnCloseDelegate closeCallback) { - minSize = new Vector2(WINDOW_WIDTH, WINDOW_HEIGHT); - maxSize = new Vector2(WINDOW_WIDTH, WINDOW_HEIGHT); - titleContent.text = "Export New Avatar"; - projectLocation = initialPath; + public void Init(string initialPath, string warnings, bool updateExisting, GameObject avatarObject, + OnExportDelegate exportCallback, OnCloseDelegate closeCallback) { + updateExistingAvatar = updateExisting; + float windowHeight = updateExistingAvatar ? UPDATE_EXISTING_WINDOW_HEIGHT : EXPORT_NEW_WINDOW_HEIGHT; + minSize = new Vector2(WINDOW_WIDTH, windowHeight); + maxSize = new Vector2(WINDOW_WIDTH, windowHeight); + avatarPreviewObject = avatarObject; + titleContent.text = updateExistingAvatar ? "Update Existing Avatar" : "Export New Avatar"; + initialProjectLocation = initialPath; + projectLocation = updateExistingAvatar ? "" : initialProjectLocation; warningText = warnings; + onExportCallback = exportCallback; onCloseCallback = closeCallback; + ShowUtility(); + + // if the avatar's starting height is outside of the recommended ranges, auto-adjust the scale to default height + float height = GetAvatarHeight(); + if (height < MINIMUM_RECOMMENDED_HEIGHT || height > MAXIMUM_RECOMMENDED_HEIGHT) { + float newScale = DEFAULT_AVATAR_HEIGHT / height; + SetAvatarScale(newScale); + scaleWarningText = "Avatar's scale automatically adjusted to be within the recommended range."; + } } - void OnGUI() { + void OnGUI() { // define UI styles for all GUI elements to be created GUIStyle buttonStyle = new GUIStyle(GUI.skin.button); buttonStyle.fontSize = BUTTON_FONT_SIZE; @@ -1192,35 +1352,82 @@ class ExportProjectWindow : EditorWindow { errorStyle.normal.textColor = Color.red; errorStyle.wordWrap = true; GUIStyle warningStyle = new GUIStyle(errorStyle); - warningStyle.normal.textColor = Color.yellow; + warningStyle.normal.textColor = COLOR_YELLOW; + GUIStyle sliderStyle = new GUIStyle(GUI.skin.horizontalSlider); + sliderStyle.fixedWidth = SLIDER_WIDTH; + GUIStyle sliderThumbStyle = new GUIStyle(GUI.skin.horizontalSliderThumb); + + // set the background for the window to a darker gray + Texture2D backgroundTexture = new Texture2D(1, 1, TextureFormat.RGBA32, false); + backgroundTexture.SetPixel(0, 0, COLOR_BACKGROUND); + backgroundTexture.Apply(); + GUI.DrawTexture(new Rect(0, 0, maxSize.x, maxSize.y), backgroundTexture, ScaleMode.StretchToFill); GUILayout.Space(10); - // Project name label and input text field - GUILayout.Label("Export project name:", labelStyle); - projectName = GUILayout.TextField(projectName, textStyle); + if (updateExistingAvatar) { + // Project file to update label and input text field + GUILayout.Label("Project file to update:", labelStyle); + projectLocation = GUILayout.TextField(projectLocation, textStyle); + } else { + // Project name label and input text field + GUILayout.Label("Export project name:", labelStyle); + projectName = GUILayout.TextField(projectName, textStyle); + + GUILayout.Space(10); + + // Project location label and input text field + GUILayout.Label("Export project location:", labelStyle); + projectLocation = GUILayout.TextField(projectLocation, textStyle); + } - GUILayout.Space(10); - - // Project location label and input text field - GUILayout.Label("Export project location:", labelStyle); - projectLocation = GUILayout.TextField(projectLocation, textStyle); - - // Browse button to open folder explorer that starts at project location path and then updates project location + // Browse button to open file/folder explorer and set project location if (GUILayout.Button("Browse", buttonStyle)) { - string result = EditorUtility.OpenFolderPanel("Select export location", projectLocation, ""); - if (result.Length > 0) { // folder selection not cancelled + string result = ""; + if (updateExistingAvatar) { + // open file explorer starting at hifi projects folder in user documents and select target fst to update + string initialPath = string.IsNullOrEmpty(projectLocation) ? initialProjectLocation : projectLocation; + result = EditorUtility.OpenFilePanel("Select .fst to update", initialPath, "fst"); + } else { + // open folder explorer starting at project location path and select folder to create project folder in + result = EditorUtility.OpenFolderPanel("Select export location", projectLocation, ""); + } + if (!string.IsNullOrEmpty(result)) { // file/folder selection not cancelled projectLocation = result.Replace('/', '\\'); } } - // Red error label text to display any file-related errors + // warning if scale is above/below recommended range or if scale was auto-adjusted initially + GUILayout.Label(scaleWarningText, warningStyle); + + // from left to right show scale label, scale slider itself, and scale value input with % value + // slider value itself is from 0.0 to 2.0, and actual scale is an exponent of it with an offset of 1 + // displayed scale is the actual scale value with 2 decimal places, and changing the displayed + // scale via keyboard does the inverse calculation to get the slider value via logarithm + GUILayout.BeginHorizontal(); + GUILayout.Label("Scale:", labelStyle); + sliderScale = GUILayout.HorizontalSlider(sliderScale, MIN_SCALE_SLIDER, MAX_SCALE_SLIDER, sliderStyle, sliderThumbStyle); + float actualScale = (Mathf.Pow(SLIDER_SCALE_EXPONENT, sliderScale) - ACTUAL_SCALE_OFFSET); + GUIStyle scaleInputStyle = new GUIStyle(textStyle); + scaleInputStyle.fixedWidth = SCALE_TEXT_WIDTH; + actualScale *= 100.0f; // convert to 100-based percentage for display purposes + string actualScaleStr = GUILayout.TextField(String.Format("{0:0.00}", actualScale), scaleInputStyle); + actualScaleStr = Regex.Replace(actualScaleStr, @"[^0-9.]", ""); + actualScale = float.Parse(actualScaleStr); + actualScale /= 100.0f; // convert back to 1.0-based percentage + SetAvatarScale(actualScale); + GUILayout.Label("%", labelStyle); + GUILayout.EndHorizontal(); + + GUILayout.Space(15); + + // red error label text to display any file-related errors GUILayout.Label("Error:", errorStyle); GUILayout.Label(errorText, errorStyle); GUILayout.Space(10); - // Yellow warning label text to display scrollable list of any bone-related warnings + // yellow warning label text to display scrollable list of any bone-related warnings GUILayout.Label("Warnings:", warningStyle); warningScrollPosition = GUILayout.BeginScrollView(warningScrollPosition, GUILayout.Width(WINDOW_WIDTH), GUILayout.Height(WARNING_SCROLL_HEIGHT)); @@ -1229,64 +1436,122 @@ class ExportProjectWindow : EditorWindow { GUILayout.Space(10); - // Export button which will verify project folder can actually be created + // export button will verify target project folder can actually be created (or target fst file is valid) // before closing popup window and calling back to initiate the export bool export = false; if (GUILayout.Button("Export", buttonStyle)) { export = true; if (!CheckForErrors(true)) { Close(); - onCloseCallback(projectDirectory, projectName, warningText); + onExportCallback(updateExistingAvatar ? projectLocation : projectDirectory, projectName, actualScale); } } - // Cancel button just closes the popup window without callback + // cancel button closes the popup window triggering the close callback to close the preview scene if (GUILayout.Button("Cancel", buttonStyle)) { Close(); } - // When either text field changes check for any errors if we didn't just check errors from clicking Export above + // when any value changes check for any errors and update scale warning if we are not exporting if (GUI.changed && !export) { CheckForErrors(false); + UpdateScaleWarning(); } } bool CheckForErrors(bool exporting) { errorText = EMPTY_ERROR_TEXT; // default to None if no errors found - projectDirectory = projectLocation + "\\" + projectName + "\\"; - if (projectName.Length > 0) { - // new project must have a unique folder name since the folder will be created for it - if (Directory.Exists(projectDirectory)) { - errorText = "A folder with the name " + projectName + - " already exists at that location.\nPlease choose a different project name or location."; + if (updateExistingAvatar) { + // if any text is set in the project file to update field verify that the file actually exists + if (projectLocation.Length > 0) { + if (!File.Exists(projectLocation)) { + errorText = "Please select a valid project file to update.\n"; + return true; + } + } else if (exporting) { + errorText = "Please select a project file to update.\n"; return true; } - } - if (projectLocation.Length > 0) { - // before clicking Export we can verify that the project location at least starts with a drive - if (!Char.IsLetter(projectLocation[0]) || projectLocation.Length == 1 || projectLocation[1] != ':') { - errorText = "Project location is invalid. Please choose a different project location.\n"; - return true; + } else { + projectDirectory = projectLocation + "\\" + projectName + "\\"; + if (projectName.Length > 0) { + // new project must have a unique folder name since the folder will be created for it + if (Directory.Exists(projectDirectory)) { + errorText = "A folder with the name " + projectName + + " already exists at that location.\nPlease choose a different project name or location."; + return true; + } } - } - if (exporting) { - // when exporting, project name and location must both be defined, and project location must - // be valid and accessible (we attempt to create the project folder at this time to verify this) - if (projectName.Length == 0) { - errorText = "Please define a project name.\n"; - return true; - } else if (projectLocation.Length == 0) { - errorText = "Please define a project location.\n"; - return true; - } else { - try { - Directory.CreateDirectory(projectDirectory); - } catch { + if (projectLocation.Length > 0) { + // before clicking Export we can verify that the project location at least starts with a drive + if (!Char.IsLetter(projectLocation[0]) || projectLocation.Length == 1 || projectLocation[1] != ':') { errorText = "Project location is invalid. Please choose a different project location.\n"; return true; } } - } + if (exporting) { + // when exporting, project name and location must both be defined, and project location must + // be valid and accessible (we attempt to create the project folder at this time to verify this) + if (projectName.Length == 0) { + errorText = "Please define a project name.\n"; + return true; + } else if (projectLocation.Length == 0) { + errorText = "Please define a project location.\n"; + return true; + } else { + try { + Directory.CreateDirectory(projectDirectory); + } catch { + errorText = "Project location is invalid. Please choose a different project location.\n"; + return true; + } + } + } + } + return false; } + + void UpdateScaleWarning() { + // called on any input changes + float height = GetAvatarHeight(); + if (height < MINIMUM_RECOMMENDED_HEIGHT) { + scaleWarningText = "The height of the avatar is below the recommended minimum."; + } else if (height > MAXIMUM_RECOMMENDED_HEIGHT) { + scaleWarningText = "The height of the avatar is above the recommended maximum."; + } else { + scaleWarningText = ""; + } + } + + float GetAvatarHeight() { + // height of an avatar model can be determined to be the max Y extents of the combined bounds for all its mesh renderers + Bounds bounds = new Bounds(); + var meshRenderers = avatarPreviewObject.GetComponentsInChildren(); + var skinnedMeshRenderers = avatarPreviewObject.GetComponentsInChildren(); + foreach (var renderer in meshRenderers) { + bounds.Encapsulate(renderer.bounds); + } + foreach (var renderer in skinnedMeshRenderers) { + bounds.Encapsulate(renderer.bounds); + } + return bounds.max.y; + } + + void SetAvatarScale(float actualScale) { + // set the new scale uniformly on the preview avatar's transform to show the resulting avatar size + avatarPreviewObject.transform.localScale = new Vector3(actualScale, actualScale, actualScale); + + // adjust slider scale value to match the new actual scale value + sliderScale = GetSliderScaleFromActualScale(actualScale); + } + + float GetSliderScaleFromActualScale(float actualScale) { + // since actual scale is an exponent of slider scale with an offset, do the logarithm operation to convert it back + return Mathf.Log(actualScale + ACTUAL_SCALE_OFFSET, SLIDER_SCALE_EXPONENT); + } + + void OnDestroy() { + onCloseCallback(); + } } diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Average.mat b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Average.mat new file mode 100644 index 0000000000..69421ca8e2 --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Average.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Average + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.53309965, g: 0.8773585, b: 0.27727836, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Floor.mat b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Floor.mat new file mode 100644 index 0000000000..4c63832593 --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Floor.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Floor + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/HeightReference.prefab b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/HeightReference.prefab new file mode 100644 index 0000000000..3a6b6b21fa --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/HeightReference.prefab @@ -0,0 +1,1393 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 0} + m_RootGameObject: {fileID: 1663253797283788} + m_IsPrefabAsset: 1 +--- !u!1 &1046656866020106 +GameObject: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 224386929081752724} + - component: {fileID: 222160789105267064} + - component: {fileID: 114930405832365464} + m_Layer: 5 + m_Name: TwoAndHalfMText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1098451480288840 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4735851023856772} + - component: {fileID: 33008877752475126} + - component: {fileID: 23983268565997994} + m_Layer: 0 + m_Name: HalfMLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1107359137501064 +GameObject: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 224352215517075892} + - component: {fileID: 222924084127982026} + - component: {fileID: 114523909969846714} + m_Layer: 5 + m_Name: TwoMText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1108041172082256 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 224494569551489322} + - component: {fileID: 223961774962398002} + - component: {fileID: 114011556853048752} + - component: {fileID: 114521005238033952} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1165326825168616 +GameObject: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 224593141416602104} + - component: {fileID: 222331762946337184} + - component: {fileID: 114101794169638918} + m_Layer: 5 + m_Name: OneAndHalfMText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1182485492886750 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4302978871272126} + - component: {fileID: 33686989621546016} + - component: {fileID: 23982106336197490} + m_Layer: 0 + m_Name: TwoAndHalfMLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1365616260555366 +GameObject: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 224613908675679132} + - component: {fileID: 222421911825862480} + - component: {fileID: 114276838631099888} + m_Layer: 5 + m_Name: OneMText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1398639835840810 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4460037940915778} + - component: {fileID: 33999849812690240} + - component: {fileID: 23416265009837404} + m_Layer: 0 + m_Name: Floor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1534720920953066 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4413776654278098} + - component: {fileID: 33291071156168694} + - component: {fileID: 23550720950256080} + m_Layer: 0 + m_Name: Average + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1594624973687270 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4908828994703896} + - component: {fileID: 33726300519449444} + - component: {fileID: 23824769923661608} + m_Layer: 0 + m_Name: Tall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1663253797283788 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4466308008297536} + m_Layer: 0 + m_Name: HeightReference + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1684603522306818 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4359301733271006} + - component: {fileID: 33170278100239952} + - component: {fileID: 23463284742561382} + m_Layer: 0 + m_Name: TwoMLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1758516477546936 +GameObject: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 224093314116541246} + - component: {fileID: 222104353024021134} + - component: {fileID: 114198955202599194} + m_Layer: 5 + m_Name: HalfMText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1843086377652878 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4967607462495426} + - component: {fileID: 33458427168817864} + - component: {fileID: 23807848267690204} + m_Layer: 0 + m_Name: Short + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1845490813592506 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4990347338131576} + - component: {fileID: 108630196659418708} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1883639722740524 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4177433262325602} + - component: {fileID: 33418961761515394} + - component: {fileID: 23536779434871182} + m_Layer: 0 + m_Name: TooShort + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1885741171197356 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4718462335765420} + - component: {fileID: 33030310456480364} + - component: {fileID: 23105277758912132} + m_Layer: 0 + m_Name: TooTall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1919147340747728 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4440944676647488} + - component: {fileID: 33820823812379558} + - component: {fileID: 23886085173153614} + m_Layer: 0 + m_Name: OneAndHalfMLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1985295559338180 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 6 + m_Component: + - component: {fileID: 4498194399146796} + - component: {fileID: 33041053251399642} + - component: {fileID: 23936786851965954} + m_Layer: 0 + m_Name: OneMLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4177433262325602 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1883639722740524} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.219375, z: -1} + m_LocalScale: {x: 200, y: 0.43875, z: 1} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4302978871272126 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1182485492886750} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 2.5, z: -0.94} + m_LocalScale: {x: 200, y: 1.0000005, z: 0.0100000035} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!4 &4359301733271006 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1684603522306818} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 2, z: -0.94} + m_LocalScale: {x: 200, y: 1.0000005, z: 0.0100000035} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!4 &4413776654278098 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1534720920953066} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 1.535625, z: -1} + m_LocalScale: {x: 200, y: 1.19375, z: 1} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4440944676647488 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1919147340747728} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 1.5, z: -0.94} + m_LocalScale: {x: 200, y: 1.0000005, z: 0.0100000035} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!4 &4460037940915778 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1398639835840810} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -50, z: -0.5} + m_LocalScale: {x: 200, y: 100, z: 2} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4466308008297536 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1663253797283788} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4990347338131576} + - {fileID: 4460037940915778} + - {fileID: 4177433262325602} + - {fileID: 4967607462495426} + - {fileID: 4413776654278098} + - {fileID: 4908828994703896} + - {fileID: 4718462335765420} + - {fileID: 224494569551489322} + - {fileID: 4735851023856772} + - {fileID: 4498194399146796} + - {fileID: 4440944676647488} + - {fileID: 4359301733271006} + - {fileID: 4302978871272126} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4498194399146796 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1985295559338180} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 1, z: -0.94} + m_LocalScale: {x: 200, y: 1.0000005, z: 0.0100000035} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!4 &4718462335765420 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1885741171197356} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 502.6325, z: -1} + m_LocalScale: {x: 200, y: 1000, z: 1} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4735851023856772 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1098451480288840} + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0.5, z: -0.94} + m_LocalScale: {x: 200, y: 1, z: 0.01} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!4 &4908828994703896 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1594624973687270} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 2.3825, z: -1} + m_LocalScale: {x: 200, y: 0.5, z: 1} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4967607462495426 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1843086377652878} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.68875, z: -1} + m_LocalScale: {x: 200, y: 0.5, z: 1} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4990347338131576 +Transform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1845490813592506} + m_LocalRotation: {x: -0.11086535, y: -0.8745676, z: 0.40781754, w: -0.23775047} + m_LocalPosition: {x: 0, y: 3, z: 77.17} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4466308008297536} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 50.000004, y: -210.41699, z: 0} +--- !u!23 &23105277758912132 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1885741171197356} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: d07e04b46b88ae54e9f418c8645f1580, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23416265009837404 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1398639835840810} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: 320b570da434d374985fe89d653ae75b, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23463284742561382 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1684603522306818} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: d1133891b03286946b3b0c63c1a57d08, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23536779434871182 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1883639722740524} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: d07e04b46b88ae54e9f418c8645f1580, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23550720950256080 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1534720920953066} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: 722779087c41d074eb632820263fc661, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23807848267690204 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1843086377652878} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: 1cd16d030e4890a4cab22d897ccfc8d8, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23824769923661608 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1594624973687270} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: 1cd16d030e4890a4cab22d897ccfc8d8, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23886085173153614 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1919147340747728} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: d1133891b03286946b3b0c63c1a57d08, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23936786851965954 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1985295559338180} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: d1133891b03286946b3b0c63c1a57d08, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23982106336197490 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1182485492886750} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: d1133891b03286946b3b0c63c1a57d08, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!23 &23983268565997994 +MeshRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1098451480288840} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 + m_Materials: + - {fileID: 2100000, guid: d1133891b03286946b3b0c63c1a57d08, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &33008877752475126 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1098451480288840} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33030310456480364 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1885741171197356} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33041053251399642 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1985295559338180} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33170278100239952 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1684603522306818} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33291071156168694 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1534720920953066} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33418961761515394 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1883639722740524} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33458427168817864 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1843086377652878} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33686989621546016 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1182485492886750} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33726300519449444 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1594624973687270} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33820823812379558 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1919147340747728} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &33999849812690240 +MeshFilter: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1398639835840810} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!108 &108630196659418708 +Light: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1845490813592506} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 2 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!114 &114011556853048752 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1108041172082256} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!114 &114101794169638918 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1165326825168616} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 128 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 256 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '1.5m + +' +--- !u!114 &114198955202599194 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1758516477546936} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 128 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 256 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 0.5m +--- !u!114 &114276838631099888 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1365616260555366} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 128 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 256 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '1.0m + +' +--- !u!114 &114521005238033952 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1108041172082256} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &114523909969846714 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1107359137501064} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 128 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 256 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '2.0m + +' +--- !u!114 &114930405832365464 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1046656866020106} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 128 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 256 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '2.5m + +' +--- !u!222 &222104353024021134 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1758516477546936} + m_CullTransparentMesh: 0 +--- !u!222 &222160789105267064 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1046656866020106} + m_CullTransparentMesh: 0 +--- !u!222 &222331762946337184 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1165326825168616} + m_CullTransparentMesh: 0 +--- !u!222 &222421911825862480 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1365616260555366} + m_CullTransparentMesh: 0 +--- !u!222 &222924084127982026 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1107359137501064} + m_CullTransparentMesh: 0 +--- !u!223 &223961774962398002 +Canvas: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1108041172082256} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &224093314116541246 +RectTransform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1758516477546936} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: -0.395} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_Children: [] + m_Father: {fileID: 224494569551489322} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -2, y: 0.55} + m_SizeDelta: {x: 300, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &224352215517075892 +RectTransform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1107359137501064} + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: -0.395} + m_LocalScale: {x: 0.0009999999, y: 0.0009999999, z: 0.0009999999} + m_Children: [] + m_Father: {fileID: 224494569551489322} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -2, y: 2.05} + m_SizeDelta: {x: 300, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &224386929081752724 +RectTransform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1046656866020106} + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: -0.395} + m_LocalScale: {x: 0.0009999999, y: 0.0009999999, z: 0.0009999999} + m_Children: [] + m_Father: {fileID: 224494569551489322} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -2, y: 2.55} + m_SizeDelta: {x: 300, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &224494569551489322 +RectTransform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1108041172082256} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 224093314116541246} + - {fileID: 224613908675679132} + - {fileID: 224593141416602104} + - {fileID: 224352215517075892} + - {fileID: 224386929081752724} + m_Father: {fileID: 4466308008297536} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1000, y: 1000} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &224593141416602104 +RectTransform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1165326825168616} + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: -0.395} + m_LocalScale: {x: 0.0009999999, y: 0.0009999999, z: 0.0009999999} + m_Children: [] + m_Father: {fileID: 224494569551489322} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -2, y: 1.55} + m_SizeDelta: {x: 300, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &224613908675679132 +RectTransform: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1365616260555366} + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: -0.395} + m_LocalScale: {x: 0.0009999999, y: 0.0009999999, z: 0.0009999999} + m_Children: [] + m_Father: {fileID: 224494569551489322} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -2, y: 1.05} + m_SizeDelta: {x: 300, y: 200} + m_Pivot: {x: 0.5, y: 0.5} diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Line.mat b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Line.mat new file mode 100644 index 0000000000..2f9a048c63 --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/Line.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Line + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/ShortOrTall.mat b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/ShortOrTall.mat new file mode 100644 index 0000000000..5543fef85e --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/ShortOrTall.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: ShortOrTall + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.91758025, g: 0.9622642, b: 0.28595585, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/TooShortOrTall.mat b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/TooShortOrTall.mat new file mode 100644 index 0000000000..4851a64056 --- /dev/null +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter/TooShortOrTall.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: TooShortOrTall + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.9056604, g: 0.19223925, b: 0.19223925, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/tools/unity-avatar-exporter/Assets/README.txt b/tools/unity-avatar-exporter/Assets/README.txt index 402719b497..767c093800 100644 --- a/tools/unity-avatar-exporter/Assets/README.txt +++ b/tools/unity-avatar-exporter/Assets/README.txt @@ -1,6 +1,6 @@ High Fidelity, Inc. Avatar Exporter -Version 0.3.3 +Version 0.3.5 Note: It is recommended to use Unity versions between 2017.4.17f1 and 2018.2.12f1 for this Avatar Exporter. @@ -9,15 +9,16 @@ To create a new avatar project: 2. Select the .fbx avatar that you imported in step 1 in the Assets window, and in the Rig section of the Inspector window set the Animation Type to Humanoid and choose Apply. 3. With the .fbx avatar still selected in the Assets window, choose High Fidelity menu > Export New Avatar. 4. Select a name for your avatar project (this will be used to create a directory with that name), as well as the target location for your project folder. -5. Once it is exported, your project directory will open in File Explorer. +5. If necessary, adjust the scale for your avatar so that it's height is within the recommended range. +6. Once it is exported, you will receive a successfully exported dialog with any warnings, and your project directory will open in File Explorer. To update an existing avatar project: -1. Select the existing .fbx avatar in the Assets window that you would like to re-export. -2. Choose High Fidelity menu > Update Existing Avatar and browse to the .fst file you would like to update. +1. Select the existing .fbx avatar in the Assets window that you would like to re-export and choose High Fidelity menu > Update Existing Avatar +2. Select the .fst project file that you wish to update. 3. If the .fbx file in your Unity Assets folder is newer than the existing .fbx file in your selected avatar project or vice-versa, you will be prompted if you wish to replace the older file with the newer file before performing the update. -4. Once it is updated, your project directory will open in File Explorer. +4. Once it is updated, you will receive a successfully exported dialog with any warnings, and your project directory will open in File Explorer. * WARNING * If you are using any external textures as part of your .fbx model, be sure they are copied into the textures folder that is created in the project folder after exporting a new avatar. -For further details including troubleshooting tips, see the full documentation at https://docs.highfidelity.com/create-and-explore/avatars/create-avatars/unity-extension +For further details including troubleshooting tips, see the full documentation at https://docs.highfidelity.com/create-and-explore/avatars/create-avatars/unity-extension \ No newline at end of file diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index f7385e38311e93788a17308f7cb2a174c7f7f138..ee3f6abe01b509bba63360b2834400660f9f3901 100644 GIT binary patch literal 74582 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