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)
#else
    public void LoadBundle(string dir, List<string> bundleList)
#endif
    {
        StartCoroutine(LoadBundles(dir, bundleName));
    }

    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++;
            if (null != OnLoading)
            {
                try
                {
                    LuaFileUtils.Instance.AddSearchBundle(name, www.assetBundle);
                    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
    private 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);

  

时间: 2024-12-27 14:27:52

Unity3D LuaBundleLoader(基于cslua)的相关文章

在Unity3D中基于订阅者模式实现事件机制

??各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是http://qinyuanpei.com.今天博主想和大家分享的是在Unity3D中基于订阅者模式实现消息传递机制,我们知道Unity3D中默认提供了一种消息传递机制SendMessage,虽然SendMessage使用起来的确非常简单,可是它的这种简单是建立在付出一定的代价的基础上的.经常有朋友提及不同的模块间如何进行通信的问题,可能答案最终会落到单例模式.委托和事件机制这些关键词上,在这种情况下本文所探讨的内容可能会帮助

Unity3D &amp; Java 基于 Protobuf 通信实现

Unity3D & Java 基于 Protobuf 通信实现 最近研究Unity3D,同时需要给游戏制定一套通信协议.因为本人是后端出生,对C#的 Socket相关通信框架不太熟悉,经过几天的学习,终于搞定了.在这里公布出来,大家可以共同学习,少走弯路. 本文重点:演示怎么解析和发送协议. 技术选型 服务端1 Java7 netty 4 客户端2 C# SuperSocket.ClientEngine https://clientengine.codeplex.com/ 它是从SuperSoc

Thinking in Unity3D:基于物理着色(PBS)的材质系统

关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎研发工作中,早已习惯性的从Unity3D中寻找解决方案. Unity3D虽比不上UE那么老练沉稳,气势磅礴.也比不上CE那样炫丽多姿,盛气凌人.但它的发展势如破竹,早已遍地生花!故而在此记录一些自己的心得体会,供大家参详交流.若有欠妥之处,还望各位及时指正. Thinking in Unity3D由一系列文章

Unity3D LuaComponent(基于ulua)

LuaComponent可以支持配一个需要执行在这个gameObject上的lua脚本,并且每个gameObject上的lua都是一个实例 using UnityEngine; using LuaInterface; using System.Collections.Generic; //Lua组件 public class LuaComponent : MonoBehaviour { //lua环境,需要在使用前给其赋值 public static LuaState s_luaState; /

Unity3D 装备系统学习Inventory Pro 2.1.2 总结

前言 写在最前面,本文未必适合纯新手,但有一些C#开发经验的还是可以看懂的,虽然本人也是一位Unity3D新人,但是本文只是自己在学习Inventory Pro的学习总结,而不是教程,本人觉得要读懂理解Inventory Pro 2.1.2 这样的插件源码,你还是需有了一部分Unity3D的基础知识.但为什么说你有一定C#开发经验也是能看懂的呢?(有点绕),我想表达的意思是,Unity3D无非是一种技术或者工具,而装备系统是游戏逻辑的一种业务,其实如果侧重点在于业务,技术和工具不是那么重要,希望

unity代码加密for Android,mono编译

uinty3d加密推荐几篇比较好的博客链接: http://www.cppcourse.com/u3d-encryption.html http://www.xuanyusong.com/archives/3553 http://m.blog.csdn.net/blog/yy405145590/41205283 http://blog.sina.com.cn/s/blog_799860f90102vp0l.html <一>加密原理 1.unity3d是基于mono的,而mono是开源的,我们重

基于Unity3D引擎制作大地图

基于Unity3D引擎制作大地图 1.下载Unity3D: http://www.devzone.cn/thread-17305-1-1.html 2.制做一张灰度图: 需求:Photoshop GIMP 先Google 搜 WorldMap-A_non-Frame.png  这个地图下载一张到你pc 然后gimp打开它, 右键图片,弹出菜单--选择--按颜色. 这张图的好处在于海洋就是几种蓝色,按照颜色分别  左键 选取这几个蓝色,按下delete键删除颜色,清理干净后如图[狗刨学习网] 然后

unity3d 基于物理渲染的问题解决

[狗刨学习网] 最近1个月做了unity 次世代开发的一些程序方面的支持工作,当然也是基于物理渲染相关的,主要还是skyshop marmoset的使用吧,他算是unity4.x版本 PBR的优秀方案之一了 但在使用以及性能上,还是多少有些坑和不足,这里也是自己的一些心得吧,希望可以其他对这个方案有兴趣的朋友起到一些帮助. 一.遇到了fps降低的BUG 国庆节前的老版本工程和最新的工程版本运行起来没任何区别,但新版本在真机上的的运行效率有问题,只有7.5fps 开发和运行环境, XCode6.1

基于Unity3D三维模型的动作插值(空间关键帧动画实现)

1.引言 最近在Unity3D中实现一个基于自定义Mesh网格的骨骼动画.存储关键帧信息,然后通过插值形成中间动画.网格GameObject之间存在父子关系.插值动画对模型骨骼的Position.Sclae.Rotation三个部分分别混合插值. 并且注意,一般选取的是子骨骼相对父骨骼的Transform信息,即上述关键帧信息具体应该为Transform.localPosition.localScale.localRotation. 并且这个系统的关键帧是定义在三维空间中的,用户在一系列关键帧点