v0.95 簡単API

API が複雑化してきたので、よくある用途を簡単にできる高レベル API を追加しました。 GltfUtilityVrmUtility が中で using してくれるので await で呼び出すだけで使えます。

GLTF

 1using System.IO;
 2using System.Threading.Tasks;
 3using UnityEngine;
 4using VRMShaders;
 5
 6namespace UniGLTF
 7{
 8    public static class GltfUtility
 9    {
10        public static async Task<RuntimeGltfInstance> LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null)
11        {
12            if (!File.Exists(path))
13            {
14                throw new FileNotFoundException(path);
15            }
16
17            Debug.LogFormat("{0}", path);
18            using (GltfData data = new AutoGltfFileParser(path).Parse())
19            using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
20            {
21                return await loader.LoadAsync(awaitCaller);
22            }
23        }
24    }
25}

VRM

 1using System;
 2using System.IO;
 3using System.Threading.Tasks;
 4using UniGLTF;
 5using UnityEngine;
 6using VRMShaders;
 7
 8namespace VRM
 9{
10    public static class VrmUtility
11    {
12        public delegate IMaterialDescriptorGenerator MaterialGeneratorCallback(VRM.glTF_VRM_extensions vrm);
13        public delegate void MetaCallback(VRMMetaObject meta);
14        public static async Task<RuntimeGltfInstance> LoadAsync(string path,
15            IAwaitCaller awaitCaller = null,
16            MaterialGeneratorCallback materialGeneratorCallback = null,
17            MetaCallback metaCallback = null
18            )
19        {
20            if (!File.Exists(path))
21            {
22                throw new FileNotFoundException(path);
23            }
24
25            using (GltfData data = new AutoGltfFileParser(path).Parse())
26            {
27                try
28                {
29                    var vrm = new VRMData(data);
30                    IMaterialDescriptorGenerator materialGen = default;
31                    if (materialGeneratorCallback != null)
32                    {
33                        materialGen = materialGeneratorCallback(vrm.VrmExtension);
34                    }
35                    using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen))
36                    {
37                        if (metaCallback != null)
38                        {
39                            var meta = await loader.ReadMetaAsync(new ImmediateCaller(), true);
40                            metaCallback(meta);
41                        }
42                        return await loader.LoadAsync(awaitCaller);
43                    }
44                }
45                catch (NotVrm0Exception)
46                {
47                    // retry
48                    Debug.LogWarning("file extension is vrm. but not vrm ?");
49                    using (var loader = new UniGLTF.ImporterContext(data))
50                    {
51                        return await loader.LoadAsync(awaitCaller);
52                    }
53                }
54            }
55        }
56    }
57}

使用例

v0.95.0 Assets/VRM_Samples/SimpleViewer/ViewerUI.cs
 1        async void LoadModelAsync(string path)
 2        {
 3            var ext = Path.GetExtension(path).ToLower();
 4            switch (ext)
 5            {
 6                case ".gltf":
 7                case ".glb":
 8                case ".zip":
 9                    {
10                        var instance = await GltfUtility.LoadAsync(path,
11                            GetIAwaitCaller(m_useAsync.isOn),
12                            GetGltfMaterialGenerator(m_useUrpMaterial.isOn));
13                        break;
14                    }
15
16                case ".vrm":
17                    {
18                        VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
19                        VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
20                        var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback);
21                        SetModel(instance);
22                        break;
23                    }