using System; using System.Collections.Generic; using System.IO; using System.Linq; using UniGLTF; using UnityEditor; using UnityEngine; using VRMShaders; namespace VRM { #if !VRM_STOP_ASSETPOSTPROCESSOR public class vrmAssetPostprocessor : AssetPostprocessor { static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { foreach (string path in importedAssets) { if (UnityPath.FromUnityPath(path).IsStreamingAsset) { Debug.LogFormat("Skip StreamingAssets: {0}", path); continue; } var ext = Path.GetExtension(path).ToLower(); if (ext == ".vrm") { try { ImportVrm(UnityPath.FromUnityPath(path)); } catch (VRMImporterContext.NotVrm0Exception) { // is not vrm0 } } } } static void ImportVrm(UnityPath vrmPath) { if (!vrmPath.IsUnderAssetsFolder) { throw new Exception(); } var parser = new GltfParser(); parser.ParseGlb(File.ReadAllBytes(vrmPath.FullPath)); var prefabPath = vrmPath.Parent.Child(vrmPath.FileNameWithoutExtension + ".prefab"); Action> onCompleted = texturePaths => { var map = texturePaths .Select(x => x.LoadAsset()) .ToDictionary(x => new SubAssetKey(x), x => x as UnityEngine.Object); using (var context = new VRMImporterContext(parser, map)) { var editor = new VRMEditorImporterContext(context, prefabPath); foreach (var textureInfo in context.TextureSetImporter.GetTextureImportParamSet().GetEnumerable()) { VRMShaders.TextureImporterConfigurator.Configure(textureInfo, context.TextureFactory.ExternalTextures); } context.Load(); editor.SaveAsAsset(); } }; // extract texture images using (var context = new VRMImporterContext(parser)) { var editor = new VRMEditorImporterContext(context, prefabPath); editor.ConvertAndExtractImages(onCompleted); } } } #endif }