v0.95
High-level API¶
As the API became more complex, we added a high-level API that simplifies common usage. GltfUtility
and VrmUtility
are used internally, so you can just call them with 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}
Example¶
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 }