示例#1
0
        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;
        }