using System; using System.Threading.Tasks; using GLTFast; using UnityEngine; namespace MyInfoMate.Vr.Scene { /// /// Chargement d'un GLB au runtime, jamais par glisser-déposer dans l'éditeur. /// C'est toute la différence : un asset posé dans la scène part dans l'APK et fige /// le contenu au build. Ici, le fichier peut venir de StreamingAssets aujourd'hui /// et du cache disque demain, sans changer une ligne d'appelant. /// public static class GltfLoader { public static async Task LoadAsync(string url, Transform parent, string name) { var import = new GltfImport(); var watch = System.Diagnostics.Stopwatch.StartNew(); if (!await import.Load(url)) { Debug.LogError($"[GltfLoader] Chargement impossible : {url}"); return null; } var root = new GameObject(name); root.transform.SetParent(parent, false); if (!await import.InstantiateMainSceneAsync(root.transform)) { Debug.LogError($"[GltfLoader] Instanciation impossible : {url}"); UnityEngine.Object.Destroy(root); return null; } Debug.Log($"[GltfLoader] {name} chargé en {watch.ElapsedMilliseconds} ms"); return root; } /// /// Sur Android, StreamingAssets est à l'intérieur de l'APK : le chemin /// est une URI jar:file://…!/assets/… que seul UnityWebRequest sait lire. /// Sur desktop c'est un chemin de fichier ordinaire. glTFast gère les deux, à /// condition qu'on lui passe une URI et pas un chemin concaténé à la main. /// public static string StreamingAssetsUrl(string fileName) { var path = System.IO.Path.Combine(Application.streamingAssetsPath, fileName); return path.Contains("://") ? path : new Uri(path).AbsoluteUri; } } }