Load AssetBundle in Editor

Лучший способ помочь другим, поделиться своими находками.

Load AssetBundle in Editor

Сообщение DbIMok 09 ноя 2011, 16:35

сорри за буржуйский заголовок, это для поисковиков. и так, появилась у меня необходимость загружать AssetBundle в редакторе. поиск готовых решений результатов не дал (есть несколько скриптов, но с проблемками), поэтому написал свой.
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections.Generic;
using System.Security.Cryptography;

public class LoadBundle : EditorWindow
{
        /// <summary>
        /// Relative path to AssetBundle file
        /// </summary>
        private static string _pathBundle;
        /// <summary>
        /// Dictionary for loaded AssetBundles
        /// </summary>
        private static Dictionary<string, AssetBundle> _bundles = new Dictionary<string, AssetBundle>();
        /// <summary>
        /// Dictionary for hashes of loaded AssetBundles
        /// </summary>
        private static Dictionary<string, byte[]> _bundlesHash = new Dictionary<string, byte[]>();
        /// <summary>
        /// EditorWindow instance
        /// </summary>
        private static LoadBundle _wnd;

        /// <summary>
        /// URL to AssetBundle file
        /// </summary>
        private string _url;
        /// <summary>
        /// Check for Run
        /// </summary>
        private bool _isRun;
        /// <summary>
        /// Check for Loaded
        /// </summary>
        private bool _isLoaded;
        /// <summary>
        /// WWW loader
        /// </summary>
        private WWW _loader;
        /// <summary>
        /// Instance of MD5 hash class
        /// </summary>
        private MD5 _hash = MD5.Create();

        /// <summary>
        /// Menu validator Assets/Ext/Load Bundle
        /// </summary>
        [MenuItem("Assets/Ext/Load Bundle", true)]
        public static bool LoadBundleValidator()
        {
                _pathBundle = AssetDatabase.GetAssetPath(Selection.activeObject);
                return Path.GetExtension(_pathBundle) == ".unity3d";
        }
        /// <summary>
        /// Menu Assets/Ext/Load Bundle
        /// </summary>
        [MenuItem("Assets/Ext/Load Bundle")]
        public static void LoadBundleToScene()
        {
                BundleToScene();
        }
        /// <summary>
        /// Menu Assets/Ext/Unload Bundles
        /// </summary>
        [MenuItem("Assets/Ext/Unload Bundles")]
        public static void UnloadAll()
        {
                if (_wnd != null)
                {
                        _wnd.Close();
                        Destroy(_wnd);
                }
                foreach (AssetBundle assetBundle in _bundles.Values)
                {
                        assetBundle.Unload(true);
                }
                _bundles.Clear();
                _bundlesHash.Clear();
        }

        /// <summary>
        /// Init EditorWindow
        /// </summary>
        static void BundleToScene()
        {
                GetWindowWithRect<LoadBundle>(new Rect(0,0,1,1));
        }
        /// <summary>
        /// Update for EditorWindow
        /// </summary>
        void Update()
        {
                if (!_isRun)
                {
                        _isRun = true;
                        if (IsLoaded()) Close();
                } else {
                        while ((_loader.assetBundle == null) && string.IsNullOrEmpty(_loader.error))
                        {
                                return;
                        }
                        if (_loader.assetBundle != null)
                        {
                                Instantiate(_loader.assetBundle.mainAsset);
                                _bundles.Add(_pathBundle, _loader.assetBundle);
                                _bundlesHash.Add(_pathBundle, _hash.ComputeHash(_loader.bytes));
                        }
                        else
                        {
                                Debug.LogWarning(_loader.error);                               
                        }
                        Close();
                }
        }
        /// <summary>
        /// Check for already loaded bundles
        /// </summary>
        /// <returns></returns>
        bool IsLoaded()
        {
                _url = string.Concat("file:///", Application.dataPath, "/../", _pathBundle);
                if (_bundles.ContainsKey(_pathBundle))
                {
                        if (!CheckHash())
                        {
                                _bundles.Remove(_pathBundle);
                                _bundlesHash.Remove(_pathBundle);
                                _loader = new WWW(_url);
                                return false;
                        }
                        Instantiate(_bundles[_pathBundle].mainAsset);
                        return true;
                }
                else
                {
                        _loader = new WWW(_url);
                        return false;
                }
        }
        /// <summary>
        /// Check hash for loaded AssetBundle and file
        /// </summary>
        /// <returns></returns>
        bool CheckHash()
        {
                StreamReader sr = new StreamReader(string.Concat(Application.dataPath, "/../", _pathBundle));
                byte[] _filehash = _hash.ComputeHash(sr.BaseStream);
                for (int i = 0; i < _filehash.Length; i++)
                {
                        if (_filehash[i] != _bundlesHash[_pathBundle][i]) return false;
                }
                return true;
        }
}

скрипт "для себя", не универсальный, поэтому допиливайте под свои потребности. для разблокирования и последующей замены загруженных файлов бандлей я использую Unlocker
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Load AssetBundle in Editor

Сообщение Neodrop 09 ноя 2011, 17:14

Спасибо. Сунул в закладки. Мало-ли, пригодится.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт


Вернуться в Исходники (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4