From 87026a85f12e0d87fac834c76095690163b79ac3 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Dec 2018 12:56:44 -0800 Subject: [PATCH] CR changes --- .../Assets/Editor/AvatarExporter.cs | 57 +++++++----------- .../avatarExporter.unitypackage | Bin 8745 -> 8716 bytes 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs index 0483e191ff..8e03dae00c 100644 --- a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs @@ -190,9 +190,13 @@ class AvatarExporter : MonoBehaviour { try { string[] lines = File.ReadAllLines(exportFstPath); foreach (string line in lines) { - if (line.StartsWith("name")) { - projectName = line.Substring(line.IndexOf("=") + 2); - break; + 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 { @@ -201,17 +205,7 @@ class AvatarExporter : MonoBehaviour { 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; - } - - string exportModelPath = Path.GetDirectoryName(exportFstPath) + "/" + assetName + ".fbx"; + 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 @@ -234,13 +228,8 @@ class AvatarExporter : MonoBehaviour { if (option == 2) { // Cancel return; } else if (option == 0) { // Yes - copy model to Unity project - // delete existing fbx and associated meta file in Unity Assets - File.Delete(assetPath); - File.Delete(assetPath + ".meta"); - AssetDatabase.Refresh(); - - // copy the fbx from the project folder to Unity Assets and import it - File.Copy(exportModelPath, assetPath); + // copy the fbx from the project folder to Unity Assets, overwriting the existing fbx, and re-import it + File.Copy(exportModelPath, assetPath, true); AssetDatabase.ImportAsset(assetPath); // set model to Humanoid animation type and force another refresh on it to process Humanoid @@ -265,25 +254,26 @@ class AvatarExporter : MonoBehaviour { copyModelToExport = option == 0; // Yes } - // delete any existing fbx if we agreed to overwrite it, and copy asset fbx over + // copy asset fbx over deleting any existing fbx if we agreed to overwrite it if (copyModelToExport) { - if (File.Exists(exportModelPath)) { - try { - File.Delete(exportModelPath); - } catch { - EditorUtility.DisplayDialog("Error", "Failed to overwrite existing file " + exportModelPath + - ". Please check the file and try again.", "Ok"); - return; - } - } try { - File.Copy(assetPath, exportModelPath); + 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 WriteFST(exportFstPath, projectName); @@ -326,9 +316,6 @@ class AvatarExporter : MonoBehaviour { // instantiate a game object of the user avatar to save out bone parents then destroy it UnityEngine.Object avatarResource = AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object)); - if (!avatarResource) { - return false; - } GameObject assetGameObject = (GameObject)Instantiate(avatarResource); SetParentNames(assetGameObject.transform, userParentNames); DestroyImmediate(assetGameObject); diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index 9562dca3804f67f5de5ba56e09904fe6dd627b19..953387223cf9eeca6372c08e724cb86b32e07ccf 100644 GIT binary patch literal 8716 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 literal 8745 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 T?$dqxZ>B#0f-f090JH!An_=EO