public override void OnImportAsset(AssetImportContext ctx) { Debug.Log("OnImportAsset to " + ctx.assetPath); try { // Create Vrm Model VrmLib.Model model = VrmLoader.CreateVrmModel(ctx.assetPath); if (model == null) { // maybe VRM-0.X return; } Debug.Log($"VrmLoader.CreateVrmModel: {model}"); // Build Unity Model var assets = EditorUnityBuilder.ToUnityAsset(model, assetPath, this); ComponentBuilder.Build10(model, assets); // Texture var externalTextures = this.GetExternalUnityObjects <UnityEngine.Texture2D>(); foreach (var texture in assets.Textures) { if (texture == null) { continue; } if (externalTextures.ContainsValue(texture)) { } else { ctx.AddObjectToAsset(texture.name, texture); } } // Material var externalMaterials = this.GetExternalUnityObjects <UnityEngine.Material>(); foreach (var material in assets.Materials) { if (material == null) { continue; } if (externalMaterials.ContainsValue(material)) { } else { ctx.AddObjectToAsset(material.name, material); } } // Mesh foreach (var mesh in assets.Meshes) { ctx.AddObjectToAsset(mesh.name, mesh); } //// ScriptableObject // avatar ctx.AddObjectToAsset("avatar", assets.HumanoidAvatar); // meta { var external = this.GetExternalUnityObjects <UniVRM10.VRM10MetaObject>().FirstOrDefault(); if (external.Value != null) { var controller = assets.Root.GetComponent <VRM10Controller>(); if (controller != null) { controller.Meta = external.Value; } } else { var meta = assets.ScriptableObjects .FirstOrDefault(x => x.GetType() == typeof(UniVRM10.VRM10MetaObject)) as UniVRM10.VRM10MetaObject; if (meta != null) { meta.name = "meta"; ctx.AddObjectToAsset(meta.name, meta); } } } // expression { var external = this.GetExternalUnityObjects <UniVRM10.VRM10Expression>(); if (external.Any()) { } else { var expression = assets.ScriptableObjects .Where(x => x.GetType() == typeof(UniVRM10.VRM10Expression)) .Select(x => x as UniVRM10.VRM10Expression); foreach (var clip in expression) { clip.name = clip.ExpressionName; ctx.AddObjectToAsset(clip.ExpressionName, clip); } } } { var external = this.GetExternalUnityObjects <UniVRM10.VRM10ExpressionAvatar>().FirstOrDefault(); if (external.Value != null) { var controller = assets.Root.GetComponent <VRM10Controller>(); if (controller != null) { controller.Expression.ExpressionAvatar = external.Value; } } else { var expressionAvatar = assets.ScriptableObjects .FirstOrDefault(x => x.GetType() == typeof(UniVRM10.VRM10ExpressionAvatar)) as UniVRM10.VRM10ExpressionAvatar; if (expressionAvatar != null) { expressionAvatar.name = "expressionAvatar"; ctx.AddObjectToAsset(expressionAvatar.name, expressionAvatar); } } } // Root ctx.AddObjectToAsset(assets.Root.name, assets.Root); ctx.SetMainObject(assets.Root); } catch (System.Exception ex) { Debug.LogError(ex); } }
public override void OnImportAsset(AssetImportContext ctx) { Debug.Log("OnImportAsset to " + ctx.assetPath); try { // Create Vrm Model VrmLib.Model model = CreateVrmModel(ctx.assetPath); Debug.Log($"ModelLoader.Load: {model}"); // Build Unity Model var builder = new UniVRM10.EditorUnityBuilder(); var assets = builder.ToUnityAsset(model, assetPath, this); ComponentBuilder.Build10(model, builder, assets); // Texture var externalTextures = this.GetExternalUnityObjects <UnityEngine.Texture2D>(); foreach (var texture in assets.Textures) { if (texture == null) { continue; } if (externalTextures.ContainsValue(texture)) { } else { ctx.AddObjectToAsset(texture.name, texture); } } // Material var externalMaterials = this.GetExternalUnityObjects <UnityEngine.Material>(); foreach (var material in assets.Materials) { if (material == null) { continue; } if (externalMaterials.ContainsValue(material)) { } else { ctx.AddObjectToAsset(material.name, material); } } // Mesh foreach (var mesh in assets.Meshes) { ctx.AddObjectToAsset(mesh.name, mesh); } //// ScriptableObject // avatar ctx.AddObjectToAsset("avatar", assets.HumanoidAvatar); // meta { var external = this.GetExternalUnityObjects <UniVRM10.VRMMetaObject>().FirstOrDefault(); if (external.Value != null) { var metaComponent = assets.Root.GetComponent <VRMMeta>(); if (metaComponent != null) { metaComponent.Meta = external.Value; } } else { var meta = assets.ScriptableObjects .FirstOrDefault(x => x.GetType() == typeof(UniVRM10.VRMMetaObject)) as UniVRM10.VRMMetaObject; if (meta != null) { meta.name = "meta"; ctx.AddObjectToAsset(meta.name, meta); } } } // blendShape { var external = this.GetExternalUnityObjects <UniVRM10.BlendShapeClip>(); if (external.Any()) { } else { var blendShapeClips = assets.ScriptableObjects .Where(x => x.GetType() == typeof(UniVRM10.BlendShapeClip)) .Select(x => x as UniVRM10.BlendShapeClip); foreach (var clip in blendShapeClips) { clip.name = clip.BlendShapeName; ctx.AddObjectToAsset(clip.BlendShapeName, clip); } } } { var external = this.GetExternalUnityObjects <UniVRM10.BlendShapeAvatar>().FirstOrDefault(); if (external.Value != null) { var blendShapeComponent = assets.Root.GetComponent <VRMBlendShapeProxy>(); if (blendShapeComponent != null) { blendShapeComponent.BlendShapeAvatar = external.Value; } } else { var blendShapeAvatar = assets.ScriptableObjects .FirstOrDefault(x => x.GetType() == typeof(UniVRM10.BlendShapeAvatar)) as UniVRM10.BlendShapeAvatar; if (blendShapeAvatar != null) { blendShapeAvatar.name = "blendShapeAvatar"; ctx.AddObjectToAsset(blendShapeAvatar.name, blendShapeAvatar); } } } // Root ctx.AddObjectToAsset(assets.Root.name, assets.Root); ctx.SetMainObject(assets.Root); } catch (System.Exception ex) { Debug.LogError(ex); } }