Esempio n. 1
0
        bool TryLoadFromLocalStorage(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished)
        {
            var localPath = AssetBundleUtility.GetLocalStoragePath(assetBundleRecord.AssetBundleName);

            if (!File.Exists(localPath))
            {
                return(false);
            }

            Debug.Log($"load from local storage: {localPath}");

            byte[] bytes;
            try
            {
                using (FileStream fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read))
                {
                    bytes = new byte[fileStream.Length];
                    fileStream.Read(bytes, 0, bytes.Length);
                    fileStream.Close();
                }
            }
            catch (Exception e)
            {
                Debug.LogError(e);
                return(false);
            }

            var result = new LoaderResult(assetBundleRecord, bytes, null);

            onFinished.Invoke(result);
            return(true);
        }
        public void EnqueueDownloadTask(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished)
        {
            if (isDestroyed)
            {
                return;
            }

            string assetBundleName = assetBundleRecord.AssetBundleName;

            if (taskDictionary.ContainsKey(assetBundleName))
            {
                errorReceiver.OnError(AssetBundleErrorCode.DuplicatePath, $"duplicate path: {assetBundleName}");
                return;
            }

            assetBundleRecordQueue.Enqueue(assetBundleRecord);
            var task = new DownloadTask(assetBundleRecord, onFinished, 0);

            taskDictionary.Add(assetBundleName, task);

            if (!isCheckingQueue)
            {
                coroutineOwner.Run(CheckQueueAsync());
                isCheckingQueue = true;
            }
        }
    public AssetBundleRecord CreateRecord(int action, int mcSystem, string filename, int version)
    {
        AssetBundleRecord r = new AssetBundleRecord();

        r.action   = action;
        r.filename = "MasterAssetManifest";
        r.system   = mcSystem;
        r.version  = 1;

        return(r);
    }
Esempio n. 4
0
        public void Load(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished, bool forciblyDownload = false)
        {
            string assetBundleName = assetBundleRecord.AssetBundleName;

            if (!forciblyDownload && TryLoadFromLocalStorage(assetBundleRecord, onFinished))
            {
                return;
            }
            actionDictionary.Add(assetBundleName, onFinished);
            downloadQueue.EnqueueDownloadTask(assetBundleRecord, downloadFinishedAction);
        }
Esempio n. 5
0
        public IEnumerator LoadAsync(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished)
        {
            string path = $"{url}{assetBundleRecord.AssetBundleName}";

            Debug.Log($"download from web: {path}");

            var request = UnityWebRequest.Get(path);

            request.downloadHandler = new DownloadHandlerBuffer();
            request.SendWebRequest();
            yield return(null);

            while (!request.isDone)
            {
                yield return(null);
            }

            if (request.isHttpError || request.isNetworkError)
            {
                var errorResult = new LoaderResult(assetBundleRecord, null, AssetBundleDownloadErrorType.Network);
                onFinished.Invoke(errorResult);
                yield break;
            }

            byte[] bytes     = request.downloadHandler.data;
            var    localPath = AssetBundleUtility.GetLocalStoragePath(assetBundleRecord.AssetBundleName);

            try
            {
                var dirPath = Path.GetDirectoryName(localPath);
                if (!Directory.Exists(dirPath))
                {
                    Directory.CreateDirectory(dirPath);
                }

                using (FileStream fileStream = new FileStream(localPath, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    fileStream.Write(bytes, 0, bytes.Length);
                    fileStream.Close();
                }
            }
            catch (Exception e)
            {
                Debug.LogError(e);
                var errorResult = new LoaderResult(assetBundleRecord, bytes, AssetBundleDownloadErrorType.IO);
                onFinished.Invoke(errorResult);
                yield break;
            }

            var successResult = new LoaderResult(assetBundleRecord, bytes, null);

            onFinished.Invoke(successResult);
        }
        public static (AssetBundleTable oldTable, AssetBundleTable newTable) LoadTableData()
        {
            if (!Directory.Exists(cacheDir))
            {
                Directory.CreateDirectory(cacheDir);
            }
            var oldTable = new AssetBundleTable();

            if (File.Exists($"{cacheDir}/{GlobalSettings.TableFileName}"))
            {
                var json = File.ReadAllText($"{cacheDir}/{GlobalSettings.TableFileName}");
                oldTable = JsonUtility.FromJson <AssetBundleTable>(json);
            }

            var records  = new List <AssetBundleRecord>();
            var newTable = new AssetBundleTable();

            // AssetGraphからビルドを行うのでビルドマップを取得する。
            var buildMap = UnityEngine.AssetGraph.AssetBundleBuildMap.GetBuildMap();

            if (buildMap != null)
            {
                var platformName     = GlobalSettings.GetPlatformName();
                var assetBundleNames = buildMap.GetAllAssetBundleNames().ToList();
                assetBundleNames.Add(platformName);

                // CRCとHashの取得方法
                // https://qiita.com/satotin/items/9373ba3c5cc85172350c
                foreach (var assetBundleName in assetBundleNames)
                {
                    var     path = $"{exportAssetBundleLocation}/{assetBundleName}";
                    uint    crc  = 0;
                    Hash128 hash;
                    if (!BuildPipeline.GetCRCForAssetBundle(path, out crc))
                    {
                        Debug.LogError("CRC Get Failed!!");
                    }
                    if (!BuildPipeline.GetHashForAssetBundle(path, out hash))
                    {
                        Debug.LogError("Hash Get Failed!!");
                    }

                    Debug.Log($"AssetBundle path:{path} crc:{crc}, hash:{hash}");
                    var rec = new AssetBundleRecord(assetBundleName, crc, hash.ToString());
                    records.Add(rec);
                }
            }

            var version = oldTable.Version + 1;

            newTable.SetData(version, records.ToArray());
            return(oldTable, newTable);
        }
    public void CreateManifestData()
    {
        _assetManifestData = new AssetManifestData();

        _assetManifestData.AssetBundleDataSet = "MasterAssetManifest";
        _assetManifestData.version            = "0.0.1";

        _assetManifestData.AssetBundleList = new List <AssetBundleRecord>();


        AssetBundleRecord record = CreateRecord
                                   (
            (int)ManifestAction.Nominal,
            (int)MCSystem.PantryItems,
            "pantryitems001",
            1
                                   );

        _assetManifestData.AssetBundleList.Add(record);

        record = CreateRecord
                 (
            (int)ManifestAction.Nominal,
            (int)MCSystem.PlatingTables,
            "platingtables",
            1
                 );
        _assetManifestData.AssetBundleList.Add(record);

        record = CreateRecord
                 (
            (int)ManifestAction.Nominal,
            (int)MCSystem.SearchTags,
            "mastertaglistbundle",
            1
                 );
        _assetManifestData.AssetBundleList.Add(record);

        record = CreateRecord
                 (
            (int)ManifestAction.Update,
            (int)MCSystem.IgniteEvents,
            "noop",
            1
                 );
        _assetManifestData.AssetBundleList.Add(record);

        SaveJsonData();
    }
        IEnumerator CheckQueueAsync()
        {
            while (taskDictionary.Count > 0)
            {
                while (assetBundleRecordQueue.Count > 0 && downloadingCount < MaxDownloadingCount)
                {
                    AssetBundleRecord record = assetBundleRecordQueue.Dequeue();
                    coroutineOwner.Run(downloader.LoadAsync(record, downloadFinishedAction));
                    downloadingCount++;

                    if (TimeUtility.DropFrameExists())
                    {
                        break;
                    }
                }

                yield return(null);
            }

            isCheckingQueue = false;
        }
Esempio n. 9
0
 public LoaderResult(AssetBundleRecord assetBundleRecord, byte[] bytes, AssetBundleDownloadErrorType?errorType = null)
 {
     this.AssetBundleRecord = assetBundleRecord;
     this.Bytes             = bytes;
     this.ErrorType         = errorType;
 }
 public DownloadTask(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished, int triedCount)
 {
     this.AssetBundleRecord = assetBundleRecord;
     this.OnFinished        = onFinished;
     this.TriedCount        = triedCount;
 }