您的位置:首页 > 移动开发 > Unity3D

unity开发之九:关于unity3d5.6.2版本 assetsBundle打包与加载,以及图片的队列加载

2017-12-18 12:45 661 查看
我们开发unity3d的项目的过程中免不了使用模型,而这些素材我们需要放在服务器上面,是不可能放在本地的,然而我们需要从服务器加载这些资源,unity3d给我们提供了一种打包形式就assetsBundle!

ps:可能会出现bug的地方,我的项目一开始出现素材再电脑正常显示,在手机上全都是问号,后来测试发现,服务器地址在电脑上不用加http://就可以拿到图片,但是手机上必须拿,然后就是发现模型在电脑可以加载,在手机上不能,测试发现素材不能共用,assetsBundle必须分开打包加载!

首先我们讲打包:

第一步我们拿到我们的模型资源,当然也可以是各种资源,制作成预制体,如图:



图中红色框框选的一个是预制体,下面的是ass包名和后缀名

第二步我们写打包代码,需要继承unityEditor,代码如下:

using UnityEditor;
using UnityEngine;

public class BuildAssetBundle
{
/// <summary>
/// 点击后,所有设置了AssetBundle名称的资源会被 分单个打包出来
/// </summary>
[MenuItem("AssetBundle/Build (Single)")]
static void Build_AssetBundle()
{
BuildPipeline.BuildAssetBundles(Application.dataPath + "/AssetBundle", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
//刷新
AssetDatabase.Refresh();
}

/// <summary>
/// 选择的资源合在一起被打包出来
/// </summary>
[MenuItem("AssetBundle/Build (Collection)")]
static void Build_AssetBundle_Collection()
{
AssetBundleBuild[] buildMap = new AssetBundleBuild[1];
//打包出来的资源包名字
buildMap[0].assetBundleName = "enemybundle";

//在Project视图中,选择要打包的对象
Object[] selects = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
string[] enemyAsset = new string[selects.Length];
for (int i = 0; i < selects.Length; i++)
{
//获得选择 对象的路径
enemyAsset[i] = AssetDatabase.GetAssetPath(selects[i]);
}
buildMap[0].assetNames = enemyAsset;

BuildPipeline.BuildAssetBundles(Application.dataPath + "/Test_AssetBundle", buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
//刷新
AssetDatabase.Refresh();
}
}


我们需要把代码放在


Editor文件夹下!

第三步我们由于 [MenuItem(“AssetBundle/Build (Collection)”)]菜单添加,我们可以在unity3d菜单栏上面看到新的选项,如图:



最后我们选中资源点击Build方式就行了,可以得到类似如下资源:



资源打包说完了!

资源加载:

第一步我们把打好的ass给后端人员,他们存好之后会给你一个接口,也就是服务器地址,我们可以通过WWW类来下载该资源,我们打包的时候是啥样的加载出来的资源也就是啥样的!代码如下:

/// <summary>
/// 请求模型
/// </summary>
IEnumerator GetModels(string path)
{
WWW getdata = new WWW(path);
yield return getdata;
UnityEngine.Object[] models = getdata.assetBundle.LoadAllAssets();
GameObject model = Instantiate((GameObject)models[0]);
model.transform.localPosition = new Vector3(0, 0, 0);
model.transform.localScale = new Vector3(5, 5, 5);
model.GetComponent<Animation>().Stop();
model.transform.SetParent(_modelParent.transform);
}


我们请求到模型之后需要实例化出来,并且可以控制位置和缩放等等。。

加载图片资源:

想要图片一张一张加载,我们可以给WWW类的请求方式中传入图片组件,代码如下:

/// <summary>
/// 获取定制图片
/// </summary>
/// <param name="_url"></param>
/// <param name="_wForm"></param>
/// <returns></returns>
IEnumerator GetPhoto(string _url, RawImage img)
{
WWW postData = new WWW(_url);
yield return postData;
img.texture = postData.texture;
}


实例化子项的时候:

GameObject item = Instantiate(_item);
item.name = _customAllInfoData.port[i].id;
StartCoroutine(GetPhoto(_customAllInfoData.port[i].texture, item.GetComponent<CustomItemScript>()._price));


这样就能形成先实例化子项,图片后续加载出来!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息