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

原创 2015年07月09日 13:49:56

经过了上篇的两文章,小生和各位看官沟通了关于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等等),小生也是在努力的查询各种材料想方设法来能解释明白这些疑问(但是说得很明了的文档真不多......),那就期待小生的下一片的基础打牢篇吧,在那里小生会对自己在实现这个过程中的种种疑问进行一下知识上的整理。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Unity3d开发(十四) AssetBundle中的资源提取

做过破解的人都知道,游戏中的美术资源没法完全加密,即便使用特别复杂的加密方式,也有办法将其中的资源提出来。这里不讨论的太深,只借助现成的工具,做些浅显的资源提取。...
  • fansongy
  • fansongy
  • 2016年06月22日 16:17
  • 10727

Unity资源热更之AssetBundle(3)———新版本AssetBundle

之前我们介绍了老版本的AssetBundle,在文章最后我们提到了在生成AB包的时候同时生成依赖关系信息文件。这样加载的时候就能够自动加载所有依赖项。而新版的AssetBundle正是采用的这样的方式...
  • y1196645376
  • y1196645376
  • 2016年09月21日 00:47
  • 7556

Unity3d之AssetBundle打包与读取

一、创建Assetbundle 在Unity3D开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新。 ...
  • mango9126
  • mango9126
  • 2017年07月10日 09:41
  • 1710

浅尝Unity 3D的Asset Bundle知识(五)-----缓存利用篇

首先小生自己庆祝一下上周小生的签证申请顺利通过了,第一次是自己做自己的担保人成功申请了签证。实在是非常的高兴。外加最近马上Swift2.0就要发布了,小生最近一直都在做一款关于汇率的App,用的就是S...
  • hfreedomx
  • hfreedomx
  • 2015年07月24日 11:24
  • 1094

浅尝Unity 3D的Asset Bundle知识(六)-----缓存利用进阶篇

经过了缓存利用相关的理解,小生对于Unity的Asset Bundle的研究也将更加深入。今天就让我们进入关于缓存使用...
  • hfreedomx
  • hfreedomx
  • 2015年08月05日 15:10
  • 1157

浅尝Unity 3D的Asset Bundle知识(一)

这是个人吧的第一篇文章,个人自认为写作文不是强项,但是会尽力把自己的学习成果写成让大家易于理解的内容,如果内容中有不足或者错误的地方,还请各位看官多多指教和包涵。小生先在此有礼了。        ...
  • hfreedomx
  • hfreedomx
  • 2015年06月24日 09:50
  • 974

浅尝Unity 3D的Asset Bundle知识(七)-----依赖的利用

通过之前的介绍,今天我们就进入资源包初级阶段的最后一部分的学习--如何利用Dependency来给你的Asset Bundle来减肥吧!         从之前的各篇学习,小生已经学会了如何使用下...
  • hfreedomx
  • hfreedomx
  • 2015年08月19日 13:49
  • 581

【Unity3d基础】Unity3d自动生成asset bundle name(2)

引言: 上一篇文章介绍了,利用System.IO的接口,收集路径下所有文件夹的方式设置asset bundle name,这一次介绍另一种方法。 原理: 经同事提醒,发现Unity有原生的资源管理...
  • u010832643
  • u010832643
  • 2016年12月17日 19:08
  • 1221

Unity3d用户手册用户攻略设置资源服务器 (Asset Server)

设置资源服务器 (Asset Server) 服务器端装置 资源服务器 (Asset Server) 的规划令其在服务器机器上的装置简略便利,一次完成。资源服务器 (Asset Server) 的...
  • u013951435
  • u013951435
  • 2014年04月04日 13:44
  • 1156

【Unity3d基础】Unity3d中自动生成asset bundle name

引言: 在unity3d的实际项目开发中,由于资源的增删改频繁,手动设置asset bundle name是一项繁琐且容易出错的工作,所以衍生出了开发自动化工具的需求。 工作原理: 以文件夹为目标,设...
  • u010832643
  • u010832643
  • 2016年12月14日 23:05
  • 881
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅尝Unity 3D的Asset Bundle知识(三)-----导入资源篇
举报原因:
原因补充:

(最多只允许输入30个字)