private async void LoadMesh(string meshPath) { _gameObject.transform.localScale = new Vector3(-1, 1, 1); var meshFilter = _gameObject.AddComponent <MeshFilter>(); Mesh mesh; while (_loadingInProgress && !_meshCache.ContainsKey(meshPath)) { await new WaitForSecondsRealtime(0.1f).WaitAsync(); } if (_loadingInProgress && !_meshCache.ContainsKey(meshPath)) { throw new Exception("WaitWhile failed"); } if (!_meshCache.ContainsKey(meshPath)) { Debug.Log($"LoadMesh({meshPath})"); _loadingInProgress = true; var startTime = DateTime.Now; var objDef = await Resources.LoadText(meshPath); var objMesh = await ObjMesh.Load(objDef); var unityMeshData = await UnityMeshData.Load(objMesh); mesh = unityMeshData.ToUnityMesh(); var time = (DateTime.Now - startTime).TotalSeconds; _meshCache[meshPath] = mesh; _loadingInProgress = false; Debug.Log($"LoadMesh({meshPath}): finished after {time}s ({objDef.Length} bytes, " + $"{unityMeshData.TriangleCount / 3} tris, {unityMeshData.VertexCount} verts)"); } else { mesh = _meshCache[meshPath]; } meshFilter.sharedMesh = mesh; }