原址: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
另外帖上开发测试,今天我去了面试,那人连看都不看,还给了我应届生的侍遇,唉`这个行业真是惨酷