不认真修炼哪有底气跟世界叫板

浅尝Unity 3D的Asset Bundle知识(三)-----导入资源篇

经过了上篇的两文章,小生和各位看官沟通了关于Asset Bundle的基本知识和初级的打包方法。今天小生和各位主要一起研究关于如何将制作好的Asset Bundle下载下来然后再通过游戏给读取出来。对于打包的讲解请参照[打包篇],小生在本文里就不多阐述了。

OK,那就让我们进入正题来探讨一下关于读取打包的知识吧。(文章中若存在难于理解或者不足之处还请各位看官追加评论,小生及时进行改善,还请多多包涵)


首先要导入资源包就需要先确定我们把我们的资源包放到哪里了,小生是把资源包直接放到了apache目录了。所以这个时候只要访问http://127.0.0.1/xxx.unity3d这个URL就可以直接下载到了。(其实你可以直接把url直接用浏览器上来试验,如果要是浏览器能下载的话,那就证明你这个url是没问题的了)


Asset Bundle文件放完之后,就要准备Unity相关的代码了。这个部分小生认为才是重中之重。

本章这次要实现的是通过URL下载下来资源包,然后在scene中把下载下来的这个GameObject实例出来,然后我们就可以在执行scene的时候看到这个物体了。(至于这个物体的构成,还请各位看官参照[打包篇])。实现后的效果图如下


虽然这是个静态效果图,但是实际运行的时候你就会看到小球慢慢落下,最后落到下面的plane上后,停止下落。


然后,我们开始以下的几个工作。

1.在上一章中,把scene中的那个小球的GameObject给删除掉。(不然就出来两个小球了,我们主要目的就是要看到小球通过加载remote的Asset Bundle来生成的不是)。



2.新建一个空的GameObject对象,如下图


可能有人要问了,建空GameObject是为啥啊,这个和Asset Bundle的读取有什么关系?-----看官别急,下文自有说明微笑


3.给这个GameObject重命名成[GameController]然后给它加上script的component,再给Transform给reset一下,最后给GameObject的Tag附值成[GameController]。你会在Inspector上看到如下图的样子。


做到这里,我想大家也就能明白了小生的意图了。由于小生在Unity方面经历尚浅,做法可能不是那么高超。(只是根据Unity的一个例子联想到用这个来实现比较好而已)但是小生就来说说小生的想法吧,在这里可能啰嗦一点,还请各位看官多多见谅。大笑


关于GameController这个东西,我理解为通过使用它可以做成一个scene的读取时候总体调配的控制器。简单来说就是我通过这个GameController把各个元素加载进来,然后加载进来后元素再执行自己的脚本(自己的脚本在物体实例化之后就会自动执行),这样就类似于GameController来控制全局的GameObject的加载,加载后的物件则自己进行自己的动作。这样我们只要把这个控制器的逻辑给设计好的话就可以把这个scene的执行流程给定制好。而在本文中这个GameController就是起到一个把小球的Asset Bundle加载进来然后实例出来的一个工作。


4.在对应的GameController.cs中加入如下代码。详见下方的代码片

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{
	private string assetBundleUrl = "http://127.0.0.1/AssetBundle/4/";

	// Use this for initialization
	void Start()
	{
		Caching.CleanCache();
		StartCoroutine(loadAssetBundle("Ball"));
	}
	
	// Update is called once per frame
	void Update()
	{
	
	}

	private IEnumerator loadAssetBundle(string assetBundleName)
	{
		if (assetBundleName != "") {
			string url = assetBundleUrl + assetBundleName + ".unity3d";
			using (WWW www = new WWW(url)) {
				yield return www;
				Debug.Log("Get asset bundle from Url : " + url);
				if (www.assetBundle.Contains(assetBundleName) == true) {
					Debug.Log("Contains " + assetBundleName + " asset bundle");
					GameObject gameObject = www.assetBundle.Load(assetBundleName) as GameObject;
					Instantiate(gameObject);
					www.assetBundle.Unload(false);
				}
			}
		}
	}
}

关于代码方面,如下的几个Api小生感觉比较重要。
WWW :  通过new了这个对象后,可以实现对URL的下载。如果要是需要用到缓存的话那就需要用到另外一个api,但是这个我们会留到以后的拔高篇来说。那里会有关于缓存Asset Bundle的使用,以及Asset Bundle的Dependency的更好一层次的使用。
Debug.Log : 这个API其实不是必要的API,但是小生还是在这里写出来目的就是适当的地方加上这个在调试和测试的时候真的能省不少事儿。绝对推荐!!!!!
www.assetBundle.Load:通过GameObject的名字在来从WWW的下载对象中读取到相应的资源。
Instantiate:把对应的GameObject在场景中实例出来,又是需要注意的就是如果这个GameObject包含Script的话在加载后脚本执行可能会有些问题,小生在此留下一个引子,在下一篇的基础打牢篇中小生会对其进行详细讲解。

以上就完成了相关的准备工作了,相比已经有人跃跃欲试了,但是执行之后发现报错!!!(对,你没有看错,是报错了,因为小生起初的时候也是出现了这个问题)原因就是因为要读取外部文件,这个时候就需要给项目加上允许访问的url的设定才可以。见下图




最后我们上个收工的图吧!!!大家可以看到项目左上方有个Ball(Clone)的GameObject,这个就是那个Asset Bundle加载进来后生成的GameObject喽!



通过这几章的学习,我想各位看官大概了解了Asset Bundle的实现了,但是里面还有很多地方(比如说Api的使用,为什么这个地方就要用到StartCoroutine等等),小生也是在努力的查询各种材料想方设法来能解释明白这些疑问(但是说得很明了的文档真不多......),那就期待小生的下一片的基础打牢篇吧,在那里小生会对自己在实现这个过程中的种种疑问进行一下知识上的整理。


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hfreedomx/article/details/46815893
上一篇浅尝Unity 3D的Asset Bundle知识(二)-----打包基础篇
下一篇浅尝Unity 3D的Asset Bundle知识(四)-----基础打牢篇
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭