示例#1
0
        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);
            }
        }
示例#2
0
        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);
            }
        }