我使用Ionic.Zip.dll从unity中提取zip文件。
适用于zip.ExtractAll(zipPath, ExtractExistingFileAction.OverwriteSilently);
但是,在提取存档时,UI会挂起(按钮效果等等)。 因此我尝试在协程中使用它但没有结果,我认为这是错误的方式。
你是否已经以这种方式提取了一些东西?
编辑:
由于Unity限制,我在跟踪线程函数的完成时遇到了问题。 最后用bool和coroutine完成它:
public bool extractionDone = false;
IEnumerator CheckLauncherExtracted() {
while(!extractionDone) yield return null;
Debug.Log("ExtractionDone done !");
OnLauncherFilesExtracted();
}
public void Extraction(){
StartCoroutine("CheckLauncherExtracted");
ThreadPool.QueueUserWorkItem(x => {
FileManager.ExtractZipToDirectory(zipPath, zipExtractPath);
extractionDone = true;
});
}
答案 0 :(得分:1)
如果zip.ExtractAll
阻止主Thread
或导致打嗝,请在新的Thread
或ThreadPool
中使用它。任何这些都应该解决你的问题。在这种情况下,Coroutine不会帮助您,除非您使用的压缩API专门用于与Unity的协程一起使用。
使用ThreadPool
:
void Start()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ExtractFile));
}
private void ExtractFile(object a)
{
zip.ExtractAll(zipPath, ExtractExistingFileAction.OverwriteSilently);
}
请注意,您无法从另一个线程调用Unity的功能。例如,上面的ExtractFile
函数在另一个Thread
中调用,如果您尝试在该函数中使用Unity API,则会出现异常。有关如何在另一个Thread
中使用Unity API,请参阅here。