/// <summary> /// Imports the corresponding asset. /// </summary> public override void Import() { var isImporterDirty = false; // Instantiate model source and model. var model = Model3Json.ToModel(CubismImporter.OnPickMaterial, CubismImporter.OnPickTexture, ShouldImportAsOriginalWorkflow); var moc = model.Moc; // Create moc asset. if (MocAsset == null) { AssetDatabase.CreateAsset(moc, AssetPath.Replace(".model3.json", ".asset")); MocAsset = moc; isImporterDirty = true; } // Create model prefab. if (ModelPrefab == null) { // Trigger event. CubismImporter.SendModelImportEvent(this, model); foreach (var texture in Model3Json.Textures) { CubismImporter.SendModelTextureImportEvent(this, model, texture); } // Create prefab and trigger saving of changes. #if UNITY_2018_3_OR_NEWER ModelPrefab = PrefabUtility.SaveAsPrefabAsset(model.gameObject, AssetPath.Replace(".model3.json", ".prefab")); #else ModelPrefab = PrefabUtility.CreatePrefab(AssetPath.Replace(".model3.json", ".prefab"), model.gameObject); #endif isImporterDirty = true; } // Update model prefab. else { var cubismModel = ModelPrefab.FindCubismModel(); if (cubismModel.Moc == null) { CubismModel.ResetMocReference(cubismModel, AssetDatabase.LoadAssetAtPath <CubismMoc>( AssetPath.Replace(".model3.json", ".asset"))); } // Copy all user data over from previous model. var source = Object.Instantiate(ModelPrefab).FindCubismModel(); CopyUserData(source, model); Object.DestroyImmediate(source.gameObject, true); // Trigger events. CubismImporter.SendModelImportEvent(this, model); foreach (var texture in Model3Json.Textures) { CubismImporter.SendModelTextureImportEvent(this, model, texture); } // Reset moc reference. CubismModel.ResetMocReference(model, MocAsset); // Replace prefab. #if UNITY_2018_3_OR_NEWER ModelPrefab = PrefabUtility.SaveAsPrefabAsset(model.gameObject, AssetPath.Replace(".model3.json", ".prefab")); #else ModelPrefab = PrefabUtility.ReplacePrefab(model.gameObject, ModelPrefab, ReplacePrefabOptions.ConnectToPrefab); #endif // Log event. CubismImporter.LogReimport(AssetPath, AssetDatabase.GUIDToAssetPath(_modelPrefabGuid)); } // Clean up. Object.DestroyImmediate(model.gameObject, true); // Update moc asset. if (MocAsset != null) { EditorUtility.CopySerialized(moc, MocAsset); // Revive by force to make instance using the new Moc. CubismMoc.ResetUnmanagedMoc(MocAsset); EditorUtility.SetDirty(MocAsset); } // Save state and assets. if (isImporterDirty) { Save(); } else { AssetDatabase.SaveAssets(); } }
/// <summary> /// Imports the corresponding asset. /// </summary> public override void Import() { var isImporterDirty = false; // Instantiate model source and model. var model = Model3Json.ToModel(CubismImporter.OnPickMaterial, CubismImporter.OnPickTexture); var moc = model.Moc; // Create moc asset. if (MocAsset == null) { AssetDatabase.CreateAsset(moc, AssetPath.Replace(".model3.json", ".asset")); MocAsset = moc; isImporterDirty = true; } // Update moc asset. else { EditorUtility.CopySerialized(moc, MocAsset); EditorUtility.SetDirty(MocAsset); } // Create model prefab. if (ModelPrefab == null) { // Trigger event. CubismImporter.SendModelImportEvent(this, model); foreach (var texture in Model3Json.Textures) { CubismImporter.SendModelTextureImportEvent(this, model, texture); } // Create prefab and trigger saving of changes. ModelPrefab = PrefabUtility.CreatePrefab(AssetPath.Replace(".model3.json", ".prefab"), model.gameObject); isImporterDirty = true; } // Update model prefab. else { // Copy all user data over from previous model. var source = Object.Instantiate(ModelPrefab).FindCubismModel(); CopyUserData(source, model); Object.DestroyImmediate(source.gameObject, true); // Trigger events. CubismImporter.SendModelImportEvent(this, model); foreach (var texture in Model3Json.Textures) { CubismImporter.SendModelTextureImportEvent(this, model, texture); } // Replace prefab. EditorUtility.CopySerialized(model.gameObject, ModelPrefab); CopyUserData(model, ModelPrefab.FindCubismModel(), true); EditorUtility.SetDirty(ModelPrefab); // Log event. CubismImporter.LogReimport(AssetPath, AssetDatabase.GUIDToAssetPath(_modelPrefabGuid)); } // Clean up. Object.DestroyImmediate(model.gameObject, true); // Save state and assets. if (isImporterDirty) { Save(); } else { AssetDatabase.SaveAssets(); } }