zoukankan      html  css  js  c++  java
  • Unity3D LuaBundleLoader(基于cslua)

    说明:异步加载lua的bundle,会优先加载cache目录下bundle(一般更新的资源都在cache下)

    using System;
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using LuaInterface;
    
    public class LuaBundleLoader : MonoBehaviour {
    
    	public delegate void DelegateLoading(int idx, int total, string bundleName, string path);
    	public delegate void DelegateLoadOver();
    
    	//正在加载中回掉
    	public DelegateLoading OnLoading;
    
    	//加载完成回掉
    	public DelegateLoadOver OnLoadOver;
    
    	//总共要加载的bundle个数
    	private int mTotalBundleCount = 0;
    
    	//当前已加载的bundle个数
    	private int mBundleCount = 0;
    
    #if UNITY_5
    	public void LoadBundle(string dir, string bundleName)
    	{
    		StartCoroutine(LoadBundles(dir, bundleName));
    	}
    #else
    	public void LoadBundle(string dir, List<string> bundleList)
    	{
    		StartCoroutine(LoadBundles(dir, bundleList));
    	}
    #endif
    	 IEnumerator CoLoadBundle(string name, string path)
    	{
    		using (WWW www = new WWW(path))
    		{
    			if (www == null)
    			{
    				Debugger.LogError(name + " bundle not exists");
    				yield break;
    			}
    
    			yield return www;
    
    			if (www.error != null)
    			{
    				Debugger.LogError(string.Format("Read {0} failed: {1}", path, www.error));
    				yield break;
    			}
    
    			mBundleCount++;
    			LuaFileUtils.Instance.AddSearchBundle(name, www.assetBundle);
    
    			try
    			{
    				if (null != OnLoading)
    				{
    					OnLoading(mBundleCount, mTotalBundleCount, name, path);
    				}
    			}
    			catch (Exception e)
    			{
    				Debug.LogError(e.Message);
    			}
    				
    			
    			www.Dispose();
    		}
    	}
    
    
    #if UNITY_5
    	private IEnumerator LoadBundles(string dir,string bundleName)		        
    #else
    	 public IEnumerator LoadBundles(string dir, List<string> bundleList)
    #endif
    	{
    		var cachePath = Application.temporaryCachePath.Replace('\', '/');
    		var streamingPath = Application.streamingAssetsPath.Replace('\', '/');
    
    		List<string> list = new List<string>();
    
    #if UNITY_5
    		
    		var bundlePath = cachePath+"/"+dir+"/"+bundleName;
    		if (!File.Exists(bundlePath))
    		{
    			bundlePath = streamingPath + "/" + dir + "/" + bundleName;
    		}
    		else
    		{
    #if UNITY_ANDROID && !UNITY_EDITOR
    			bundlePath = "file:///" + bundlePath;
    #endif
    		}
    #if UNITY_ANDROID && !UNITY_EDITOR
            
    #else
    		bundlePath = "file:///" + bundlePath;
    #endif
    		using (WWW www = new WWW(bundlePath))
    		{
    			yield return www;
    
    			AssetBundleManifest manifest = (AssetBundleManifest)www.assetBundle.LoadAsset("AssetBundleManifest");
    			list = new List<string>(manifest.GetAllAssetBundles());
    			//www.assetBundle.Unload(true);
    			www.Dispose();
    		}
    #else
            list = bundleList;
    #endif
    		mTotalBundleCount = list.Count;
    
    		for (int i = 0; i < list.Count; i++)
    		{
    			string str = list[i];
    
    			string path =cachePath+"/"+dir+"/"+str;
    			if (!File.Exists(path))
    			{
    				path = streamingPath + "/" + dir + "/" + str;
    			}
    			else
    			{
    #if UNITY_ANDROID && !UNITY_EDITOR
    				path = "file:///" + path;
    #endif
    			}
    #if UNITY_ANDROID && !UNITY_EDITOR
    			
    #else
    			path = "file:///" + path;
    #endif
    			string name = Path.GetFileNameWithoutExtension(str);
    			StartCoroutine(CoLoadBundle(name, path));
    		}
    
    		yield return StartCoroutine(CheckLoadFinish());
    	}
    
    	IEnumerator CheckLoadFinish()
    	{
    		while (mBundleCount < mTotalBundleCount)
    		{
    			yield return null;
    		}
    
    		if (null != OnLoadOver)
    		{
    			try
    			{
    				OnLoadOver();
    			}
    			catch (Exception e)
    			{
    				Debug.LogError(e.Message);
    			}
    			
    		}
    	}
    
    }
    

      

    使用代码

    var loader = GetComponent<LuaBundleLoader>();
    			if (null == loader)
    			{
    				loader = gameObject.AddComponent<LuaBundleLoader>();
    			}
    
    			loader.OnLoading = (idx, total, bundleName, path) =>
    			{
    				Debug.Log(path+"    ok");
    			};
    
    			loader.OnLoadOver = OnBundleLoadOver;
    
    			loader.LoadBundle(LuaConst.osDir, LuaConst.osDir);
    

      

  • 相关阅读:
    小程序开发-7-访问api数据与ES6在小程序中的应用
    小程序开发-8-流行页面编码与组件的细节知识
    小程序开发-6-组件数据、事件与属性
    当安装mongodb客户端出现了Failed to load list of databases
    对bluebird的理解
    百度地图实现案例
    iScroll实现下拉刷新上拉加载
    nodejs环境变量配置
    检测Python程序本身是否已经在运行
    用Python快速找到出现次数最多的数据
  • 原文地址:https://www.cnblogs.com/mrblue/p/5571135.html
Copyright © 2011-2022 走看看