新工作还不到两个星期,趁现在脑子清醒不忙的时候写点东西,哈哈,技术上我还是菜鸟。反正就是各种上网查资料,各种理解,打包成功了,但是在加载资源时卡死了,报空指针和不能打开文件。当时那叫一个无助啊,问老大他说怎么怎么样,我按照他说的去试,结果还是没有加载出来,然后问了一下同事,他看了一眼改了一处就给我加载出来了。然后我就哭了,不是解决问题的那种喜极而泣,而是深度怀疑自己的能力,觉得自己并不适合程序这一行业。因为我没有那种解决问题的那种思维,只是上网搜资料,复制粘贴别人的代码去试,浪费了好多时间和精力不说,我在技术上也没有任何长进。还是想在这个行业坚持下去。
呃,聊点有用的吧。首先是打包
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Collections;
using UnityEditor;
using System.IO;
public class DoAssetbundle : MonoBehaviour
{
[MenuItem("AssetBundle/Create All AssetBundles")] //设置编辑器菜单选项
static void CreateAllAssetBundles()
{
//打包资源的路径,打包在对应平台的文件夹下
string targetPath = Application.dataPath + "/Bundles";
if (!Directory.Exists(targetPath))
{
Directory.CreateDirectory(targetPath);
}
{
[MenuItem("AssetBundle/Create All AssetBundles")] //设置编辑器菜单选项
static void CreateAllAssetBundles()
{
//打包资源的路径,打包在对应平台的文件夹下
string targetPath = Application.dataPath + "/Bundles";
if (!Directory.Exists(targetPath))
{
Directory.CreateDirectory(targetPath);
}
BuildPipeline.BuildAssetBundles(targetPath, BuildAssetBundleOptions.None | BuildAssetBundleOptions.CollectDependencies, BuildTarget.StandaloneWindows);
//刷新编辑器
AssetDatabase.Refresh();
}
}
然后是加载资源
AssetBundle ab = AssetBundle.LoadFromFile(/*"file://"*/ Application.dataPath + "/Bundles/01.unity3d");
AssetBundle ab02 = AssetBundle.LoadFromFile(Application.dataPath + "/Bundles/02.unity3d");
Debug.Log(ab);
Object obj1 = ab.LoadAsset("Cube");
GameObject obj2 = ab02.LoadAsset("Sphere") as GameObject;
AssetBundle ab02 = AssetBundle.LoadFromFile(Application.dataPath + "/Bundles/02.unity3d");
Debug.Log(ab);
Object obj1 = ab.LoadAsset("Cube");
GameObject obj2 = ab02.LoadAsset("Sphere") as GameObject;
if (obj1 is GameObject)
{
Instantiate(obj1);
{
Instantiate(obj1);
}
else if (obj1 is Texture)
{
return;
}
Instantiate(obj2);
else if (obj1 is Texture)
{
return;
}
Instantiate(obj2);
我用if判断是因为要完成老大的要求(这些只是老大让我研究的东西,并不是真正的项目)。
我这是将资源都打包在一起了,当我单独打包Shader时再去用上面那个方法去加载发现材质丢失,然后我就又卡在这了。问了一下老大他说你如果把依赖项也打包的话加载资源的时候先把依赖项加载出来。我试了,很对(哈哈,我现在脑子不会思考了)
//加载shader
AssetBundle abShader = AssetBundle.LoadFromFile(Application.dataPath+ "/Bundles/01sheder");
GameObject objShader = abShader.LoadAsset("myTest") as GameObject;
//加载材质
AssetBundle abMat = AssetBundle.LoadFromFile(Application.dataPath+ "/Bundles/01mat");
GameObject objMat = abMat.LoadAsset("mat")as GameObject;
//加载资源
AssetBundle ab = AssetBundle.LoadFromFile(/*"file://"*/ Application.dataPath + "/Bundles/01.unity3d");
AssetBundle ab02 = AssetBundle.LoadFromFile(Application.dataPath + "/Bundles/02.unity3d");
Debug.Log(ab);
Object obj1 = ab.LoadAsset("Cube");
GameObject obj2 = ab02.LoadAsset("Sphere") as GameObject;
AssetBundle abShader = AssetBundle.LoadFromFile(Application.dataPath+ "/Bundles/01sheder");
GameObject objShader = abShader.LoadAsset("myTest") as GameObject;
//加载材质
AssetBundle abMat = AssetBundle.LoadFromFile(Application.dataPath+ "/Bundles/01mat");
GameObject objMat = abMat.LoadAsset("mat")as GameObject;
//加载资源
AssetBundle ab = AssetBundle.LoadFromFile(/*"file://"*/ Application.dataPath + "/Bundles/01.unity3d");
AssetBundle ab02 = AssetBundle.LoadFromFile(Application.dataPath + "/Bundles/02.unity3d");
Debug.Log(ab);
Object obj1 = ab.LoadAsset("Cube");
GameObject obj2 = ab02.LoadAsset("Sphere") as GameObject;
//Object obj;
//obj = ab.LoadAsset(name);
//if(obj == null)
//{
// obj = ab.mainAsset;
// if(obj == null)
// {
// obj = ab.LoadAllAssets()[0];
// if (obj == null) throw new System.Exception("123");
// }
//}
//obj = ab.LoadAsset(name);
//if(obj == null)
//{
// obj = ab.mainAsset;
// if(obj == null)
// {
// obj = ab.LoadAllAssets()[0];
// if (obj == null) throw new System.Exception("123");
// }
//}
if (obj1 is GameObject)
{
Instantiate(obj1);
}
else if (obj1 is Texture)
{
return;
}
Instantiate(obj2);
else if (obj1 is Texture)
{
return;
}
Instantiate(obj2);
然后我的问题就解决了,其实是我在看资料的时候不注意细节,长记性了。
还有 Object obj1 = ab.LoadAsset("Cube");
GameObject obj2 = ab02.LoadAsset("Sphere") as GameObject;
GameObject obj2 = ab02.LoadAsset("Sphere") as GameObject;
里面要写你所打包资源的名字,比如说我把预制体Cube打包,那么我里面就要写他的名字,而不是AB的名字,这玩意坑的我好惨,老大说那个用下面那个方法
//Object obj;
//obj = ab.LoadAsset(name);
//if(obj == null)
//{
// obj = ab.mainAsset;
// if(obj == null)
// {
// obj = ab.LoadAllAssets()[0];
// if (obj == null) throw new System.Exception("123");
// }
//}
//obj = ab.LoadAsset(name);
//if(obj == null)
//{
// obj = ab.mainAsset;
// if(obj == null)
// {
// obj = ab.LoadAllAssets()[0];
// if (obj == null) throw new System.Exception("123");
// }
//}
这个要写AB的名字。
好了,我就先写我理解的这么多吧!菜鸟正在努力进步,加油。