Beispiel #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);
            }
        }
Beispiel #2
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            Debug.Log("OnImportAsset to " + ctx.assetPath);

            try
            {
                // Create model
                VrmLib.Model model = CreateGlbModel(ctx.assetPath);
                Debug.Log($"ModelLoader.Load: {model}");

                // Build Unity Model
                var assets = EditorUnityBuilder.ToUnityAsset(model, assetPath, this);

                // 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);
                }

                // Root
                ctx.AddObjectToAsset(assets.Root.name, assets.Root);
                ctx.SetMainObject(assets.Root);
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex);
            }
        }