unity eclipse打包时的资源加载

有一些渠道包需要先导eclipse,eclipse会压缩资源,但如果打的资源包本来就是压缩过,只能将包体缩小一点点,没多大用处,

使用AssetBundle.LoadFromFile加载资源时很慢,进入游戏加载资源比较多,一卡卡上一分钟之久,用unity直接打包就没这个问题,

使用java来加载就会报out of memory,也不行,jni试了下,写得乱七八糟的不行,

以下方法可行

 

 

 

if (androidJavaObject == null) {
AndroidJavaClass SDK = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
androidJavaObject = SDK.GetStatic<AndroidJavaObject>("currentActivity");
}


//byte[] bts = jo.Call<byte[]> ("LoadAB", string.Format ("{0}/{1}.assetbundle", GM.sysPlatform, lpath), androidJavaObject);

//取得应用的Activity
//androidJavaObject
var assetManager = androidJavaObject.Call<AndroidJavaObject>("getAssets");

//打开文件流
var stream = assetManager.Call<AndroidJavaObject>("open", string.Format ("{0}/{1}.assetbundle", GM.sysPlatform, lpath));
//获取文件长度
var availableBytes = stream.Call<int>("available");

//取得InputStream.read的MethodID
var clsPtr = AndroidJNI.FindClass("java.io.InputStream");
var METHOD_read = AndroidJNIHelper.GetMethodID(clsPtr, "read", "([B)I");

//申请一个Java ByteArray对象句柄
var byteArray = AndroidJNI.NewByteArray(availableBytes);
//调用方法
int readCount = AndroidJNI.CallIntMethod(stream.GetRawObject(), METHOD_read, new[] { new jvalue() { l = byteArray } });
//从Java ByteArray中得到C# byte数组
var bytes = AndroidJNI.FromByteArray(byteArray);
//删除Java ByteArray对象句柄
AndroidJNI.DeleteLocalRef(byteArray);
//关闭文件流
stream.Call("close");
stream.Dispose();

AssetBundle c = AssetBundle.LoadFromMemory(bytes);
if (c) {
obj = c.LoadAsset (name);
}

posted @ 2018-03-05 17:48  sevenmoons  阅读(212)  评论(0编辑  收藏  举报