Unity Web Cache


原址:http://www.cnblogs.com/solq/archive/2012/08/29/2661288.html

 

今天很难过,辛辛苦苦熬了一年,到头来白白浪费,唉~什么都要重头来过。。。。。。。

我们组开发的项目有点希望,最终还是停掉,,,太可惜·!最糟糕的是,所有人都停雇。。我们项目经理也很难过。

我对游戏这个行业已经心灰意冷,,都是山寨一个模式,所谓的最受欢迎游戏也是刷上去的。

没办法,人家出钱刷,搞创意的就这样永远刷下去。

现在国内用unity来开发web的少之又少,几乎webgame都是山寨,而且还是山寨最受欢迎的。

所有搞正规的公司都是这样做,,,你不做就倒闭。我也不想进这样的公司,什么是农码,进去就知道。

我把我研究的分享出去:就当打点广告吧。我觉得应该算是国内首发吧,其实这例子很早就写出来了

转载请注明:http://www.cnblogs.com/solq

解决思路

用unity 自带的压缩 BuildPipeline.BuildAssetBundle 来压缩

生成的u3d 文件之后 再读回来,因为是byte 格式的,所以转换成 string  js 就能识别跟调用了,而 js 网页是可以缓存的。

 

换句话就是unity 缓存转换成 浏览器缓存

 

byte 转换成 stirng ,由于我的水平也有限,加上只用了两三天的时间才磨出来的。只想到用将 byte 转换成base64 格式。

 

需要解决的问题:

剩下的就是分类转换,按类型读取、宣染。还有读取数据内存释放的问题了,这个就要看你的项目的怎么做的

 

webtpl:

我用了 headjs 库来加载untiy 生成资源的 base64 string 文件

请看生成的格式:

(function($){

    var solq={};

    var unityData={};

    if (typeof console == "undefined")

    {

        varconsole=function(){};

        $.console=console;

    }

 

    $.debug=$.console;

    $.unityData=unityData;

    $.solq=solq;

})(window);

function GetUnity() {

    if (typeof unityObject != "undefined") {

        returnunityObject.getObjectById("unityPlayer");

    }

    return null;

}

 

function getData(file)

{

   head.js("js/"+file+".js",function(){

        if (typeof window.unityData[file] != "undefined")

        {

           sendToUnity(window.unityData[file]);

        }else

        {

            debug.log("出错");

        }

    });

   

}

function sendToUnity(data)

{

    GetUnity().SendMessage("Cube","jsCallMe", data);     //Cube unity 里的对象, jsCallMe 是该对象绑定的脚本方法

}

1.用全局 window.unityData 来保存所有unity资源

2.unity生成的JS flie 格式,大家看编码就知道了

window.unityData.img1="VW5pdHlXZWIAAAAAAjMueC54ADMuNC4wZjUAAAAIGQAAADgAAAABAAAAAQAAB+EAABbQAAAIGQBdAACAANAWAAAAAAAAAABn/qjoEwenCLuz+otfJQ8ExzwVgfBgOH/zCEraM4oXXjRBI";

这样JS读取UNITY资源 缓存api 就这样写好了,,,你能相信吗?

3.unity生成 base64string

View Code

using UnityEngine;

using System.Collections;

using System.Threading;

using System;

using System.IO;

//cnblogs.com/solq

public class SCacheAPI : MonoBehaviour

{

    public string calljs = "getData";

    public string file = "";//加载文件

    string data = "没有加载";

 

    void jsCallMe(stringbase64_data) //js call c sharp

    {

        StartCoroutine(load_data(base64_data));

    }

 

    IEnumerator load_data(string base64_data) //页面加载处理

    {

        byte[] buf= Convert.FromBase64String(base64_data);

        AssetBundleCreateRequest req =AssetBundle.CreateFromMemory(buf); //在内存创建,并且异步方式加载

 

        yield return req; //或者以下面方式,自己去实现,不过就用内部的吧

        /*

        while (!req.isDone)

        {

            Thread.Sleep(100);

            yield return null;

        }*/

        Texture t =(Texture)req.assetBundle.mainAsset;

        renderer.material.mainTexture = t;

        data = "页面完成加载";

    }

    /*

     本地读取资源有两个方式,直接读生成的 base64 格式,

     还有一种就是读 u3d 格式

     */

    void load_locahost_data()   //本地编辑器加载处理

    {

        string path= Application.dataPath + "/../BuildData/text/" + file+".txt";

       

        if(!File.Exists(path))

        {

            Debug.Log("路径 文件出错");

            Debug.Log(path);

            return ;

        }

 

        //以csharp 方式去读 u3d 文件,,或者你可以用 unity自带的方式去读

        FileStream fs = File.OpenRead(path);

        int len=(int)fs.Length;

        byte[] buf= new byte[len];

        fs.Read(buf, 0,len);

        fs.Close();

        //将读好的文件 byte 或者成 base64

        stringbase64_data = System.Text.Encoding.Default.GetString(buf);

        StartCoroutine(load_data(base64_data));          

        //Debug.Log(req.url + "          " + Application.dataPath);    

       

    }

    public void initLoad()

    {

 

        if(Application.isWebPlayer)

        {

            Application.ExternalCall(calljs,file);

        }           

        else if (Application.isEditor) //加载本地的资源

        {

            load_locahost_data();

        }

        else if (Application.isPlayer) // pcios android

        {

           

        }

    }

 

    void OnGUI()

    {

        data = GUI.TextArea(new Rect(50, 100, 500, 100), data);

    }

}

4.通过 unity call js

Application.ExternalCall("getData",file);

 

代码我就不详细讲解了,大家看工程示例吧

http://files.cnblogs.com/solq/solq_unity_web_cache.rar

另外帖上开发测试,今天我去了面试,那人连看都不看,还给了我应届生的侍遇,唉`这个行业真是惨酷

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值