/// <summary>
        /// Displays the mesh at the given path in the Scene view.
        /// </summary>
        /// <param name="meshFullPath"></param> The full path to the mesh.
        public void DisplayMeshInSceneView(string meshFullPath)
        {
            _loadedMeshFullPath = GeneralToolkit.CopyObjectFromPathIntoResources(meshFullPath);
            GeneralToolkit.MakeMeshReadable(_loadedMeshFullPath);
            Mesh loadedMesh = Resources.Load <Mesh>(Path.GetFileNameWithoutExtension(_loadedMeshFullPath));

            if (_loadedMeshFilter == null)
            {
                _loadedMeshFilter = new GameObject("Visualization Mesh").AddComponent <MeshFilter>();
                _loadedMeshFilter.gameObject.AddComponent <MeshRenderer>().material = new Material(GeneralToolkit.shaderStandard);
            }
            _loadedMeshFilter.mesh = loadedMesh;
            Debug.Log(GeneralToolkit.FormatScriptMessage(this.GetType(), "Displayed mesh for visualization, with: " + loadedMeshFaceCount + " faces."));
        }
        /// <summary>
        /// Coroutine that saves the specified global mesh asset into the asset bundle.
        /// </summary>
        /// <returns></returns>
        private IEnumerator SaveGlobalMeshAsAssetCoroutine()
        {
            // Set the destination paths to a temporary asset folder.
            string bundledAssetName  = GetBundledAssetName(globalMeshAssetName);
            string assetPathAbsolute = GetAssetPathAbsolute(bundledAssetName);
            string assetPathRelative = GetAssetPathRelative(bundledAssetName);

            // Check if the asset has already been processed.
            if (!dataHandler.IsAssetAlreadyProcessed(assetPathRelative))
            {
                // If the mesh to store is already an asset, move it to the asset bundle path.
                string dstExtension = Path.GetExtension(_globalMeshPathAbsolute);
                if (dstExtension == ".asset")
                {
                    // Copy the asset to the destination path.
                    GeneralToolkit.Replace(PathType.File, _globalMeshPathAbsolute, assetPathAbsolute);
                    // Refresh the asset database.
                    AssetDatabase.Refresh();
                }
                // Otherwise, the mesh first has to be converted into an asset.
                else
                {
                    // Copy the mesh to the resources folder.
                    string dstFullPath = GeneralToolkit.CopyObjectFromPathIntoResources(_globalMeshPathAbsolute);
                    yield return(null);

                    // Make the mesh readable so that colliders can be added.
                    GeneralToolkit.MakeMeshReadable(dstFullPath);
                    // Load the mesh from resources.
                    Mesh loadedMesh = Resources.Load <Mesh>(Path.GetFileNameWithoutExtension(dstFullPath));
                    // Copy the mesh by instantiating it.
                    globalMesh = (Mesh)Instantiate(loadedMesh);
                    // Recalculate the mesh's normals and bounds.
                    globalMesh.RecalculateNormals();
                    globalMesh.RecalculateBounds();
                    // Create an asset from the copied mesh.
                    AssetDatabase.CreateAsset(globalMesh, assetPathRelative);
                    AssetDatabase.Refresh();
                    // Delete the mesh that was copied into the resources folder.
                    GeneralToolkit.Delete(dstFullPath);
                }
            }
            Mesh meshAsset = AssetDatabase.LoadAssetAtPath <Mesh>(assetPathRelative);

            globalMesh = (Mesh)Instantiate(meshAsset);
        }