UniVRM/Packages/VRM10/Editor/ScriptedImporter/VrmaScriptedImporter.cs
2025-11-17 15:02:40 +09:00

61 lines
2.1 KiB
C#

using UniGLTF;
using UnityEngine;
using System.Linq;
using UnityEditor.AssetImporters;
namespace UniVRM10
{
[ScriptedImporter(1, "vrma")]
public class VrmaScriptedImporter : ScriptedImporter
{
/// <summary>
/// Vrm-1.0 の Asset にアイコンを付与する
/// </summary>
static Texture2D _AssetIcon = null;
static Texture2D AssetIcon
{
get
{
if (_AssetIcon == null)
{
// try package
_AssetIcon = UnityEditor.AssetDatabase.LoadAssetAtPath<Texture2D>("Packages/com.vrmc.vrm/Icons/vrm-48x48.png");
}
return _AssetIcon;
}
}
public override void OnImportAsset(AssetImportContext context)
{
// 2 回目以降の Asset Import において、 Importer の設定で Extract した UnityEngine.Object が入る
var extractedObjects = GetExternalObjectMap()
.Where(x => x.Value != null)
.ToDictionary(kv => new SubAssetKey(kv.Value.GetType(), kv.Key.name), kv => kv.Value);
using (var data = new AutoGltfFileParser(assetPath).Parse())
{
var vrmaData = new VrmAnimationData(data);
using (var loader = new VrmAnimationImporter(vrmaData, extractedObjects))
{
var loaded = loader.Load();
loaded.TransferOwnership((k, o) =>
{
context.AddObjectToAsset(k.Name, o);
});
var root = loaded.Root;
GameObject.DestroyImmediate(loaded);
// var vrma = root.GetComponent<Vrm10AnimationInstance>();
// context.AddObjectToAsset("__boxman_mesh__", vrma.BoxMan.sharedMesh);
// context.AddObjectToAsset("__boxman_mesh__material__", vrma.BoxMan.sharedMaterial);
context.AddObjectToAsset(root.name, root, AssetIcon);
context.SetMainObject(root);
}
}
}
}
}