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")
    {
        var console=function(){};
        $.console=console;
    }

    $.debug=$.console;
    $.unityData=unityData;
    $.solq=solq;
})(window);
function GetUnity() {
    if (typeof unityObject != "undefined") {
        return unityObject.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(string base64_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 ;
        }

        //以c sharp 方式去读 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 
        string base64_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) // pc ios 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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值