在本文,筆者將教大家怎么使用第三方工具下載 AssetStore 的資源,適用到Unity 2019。
前言:
一直沒怎么在 Assetstore下載大體量的資源,故而也沒發(fā)現(xiàn) Unity 這個(gè)只能使用Unity 中 下載資源有什么不好的。
最近公司買了Lisence 送了一個(gè) 11.3GB 的資源,就像下載看看,結(jié)果下載到 85% 就歸零重新下載,然后下載到97%又歸零。

所以筆者就糾結(jié)了,要是能使用第三方下載工具下載就好啦。
發(fā)現(xiàn) :
困惑中,發(fā)現(xiàn)了這篇文章 : 使用外部下載器下載 unity assetstore 資源 - 簡書 ,嗯很酷!
但是沒想到的是,從Unity 5.5 開始上述文章中發(fā)現(xiàn)的 DecryptFile 方法不見了。
于是筆者想:如果Unity 5.4 還能用AssetStore,那就表明這個(gè)解密算法肯定沒變!
但是,把 5.3 版本的UnityEditor.dll 直接扔到Unity 工程中怕有啥類型重復(fù)的報(bào)錯(cuò),所以把關(guān)鍵代碼反編譯給大家好了:
using UnityEditor;
using Babybus.Framework.ExtensionMethods;
using UnityEngine;
using System;
using System.Globalization;
using System.IO;
using System.Security.Cryptography;
class DecryptUtility
{
[MenuItem("Utility/DecryptFile")]
static void DecryptFile()
{
var inputFile =Path.Combine( Application.dataPath , "../7140748a-ecf3-4635-938c-bb902e51d8b9");
var key = "3f7f98ead6782cf120a86bbca6c1f19a08ca7c2717b6227cb7237df7cadb2ede89cc1676a2bbe679d4cbb8f89761c1c2";
DecryptFile(inputFile, inputFile + ".unitypackage", key);
}
private static void HexStringToByteArray(string hex, byte[] array, int offset)
{
if (offset + array.Length * 2 > hex.Length)
{
throw new ArgumentException("Hex string too short");
}
for (int i = 0; i < array.Length; i++)
{
string s = hex.Substring(i * 2 + offset, 2);
array[i] = byte.Parse(s, NumberStyles.HexNumber);
}
}
public static void DecryptFile(string inputFile, string outputFile, string keyIV)
{
if (!File.Exists(inputFile))
{
Debug.Log("文件不存在");
return;
}
byte[] array = new byte[32];
byte[] array2 = new byte[16];
HexStringToByteArray(keyIV, array, 0);
HexStringToByteArray(keyIV, array2, 64);
EditorUtility.DisplayProgressBar("Decrypting", "Decrypting package", 0f);
FileStream fileStream = File.Open(inputFile, FileMode.Open);
FileStream fileStream2 = File.Open(outputFile, FileMode.CreateNew);
long length = fileStream.Length;
long num = 0L;
AesManaged aesManaged = new AesManaged();
aesManaged.Key = array;
aesManaged.IV = array2;
CryptoStream cryptoStream = new CryptoStream(fileStream, aesManaged.CreateDecryptor(aesManaged.Key, aesManaged.IV), CryptoStreamMode.Read);
try
{
byte[] array3 = new byte[40960];
int num2;
while ((num2 = cryptoStream.Read(array3, 0, array3.Length)) > 0)
{
fileStream2.Write(array3, 0, num2);
num += (long)num2;
if (EditorUtility.DisplayCancelableProgressBar("Decrypting", "Decrypting package", (float)num / (float)length))
{
throw new Exception("User cancelled decryption");
}
}
}
finally
{
cryptoStream.Close();
fileStream.Close();
fileStream2.Close();
EditorUtility.ClearProgressBar();
}
}
}
使用:
- 工程中創(chuàng)建 Editor 文件夾。
- 拷貝代碼新建腳本到上述 Editor 文件夾中。
- 代碼中配置下載好的文件路徑和從那個(gè)json 中拿到的KEY 。
- 菜單欄 Utility → DecryptFile 開始解密。
- 解密OK的文件與源文件在同一目錄下。
效果:
這個(gè)速度有點(diǎn)不可思議,不科學(xué)。

結(jié)語:
- 軟件體驗(yàn)真的是一個(gè)很大的課題,下載體驗(yàn)不好還搞壟斷就太不應(yīng)該了。
- 軟件都是慢慢成長的,這么重要的 API 早期的 Unity 還不是可以直接反編譯看到。
- 鎖君子不鎖小人,像我們這么正直的人,安全的很。
2020年11月4日更新
上文提到的參考簡書博文乃至博主都被ban了,本文前傳請(qǐng)參考:
1.另辟蹊徑下載 UnityStore 文件資源_花、sir的專欄-CSDN博客
2.談?wù)凙ssetStore及其脫離Unity下載方法_setsuodu的博客-CSDN博客