各位看官,今天小生心情特是忐忑,明天就要去赤坂的美国大使馆去面签了,祝小生能够顺利下签吧~!(题外话题外话)虽然是各种心情忐忑,工作学习还是不能停下来的,那就让我们继续上三篇之后的基础牢固复习吧。这篇文章主要是来和探讨一下打包篇和包加载篇中的一下Api(小生感觉比较重要的)的使用。关于具体的代码小生都在上两篇中加了代码片了,对详细代码感兴趣的看官就请看上两篇文章,小生就不在这里多多阐述了。
那就让我们开始一起研究关于一下的Api吧!(可能有些Api小生理解的不是很准确,还期望各位大牛多多拍砖和指教啊)
1. UnityEngine :
关于UnityEngine,小生查看了具体的类文件,发现原来这个UnityEngine其实就是一个namespace。
Object :
Object是在UnityEngine的命名空间下的一个抽象类,具体类的内容请参照小生的代码片。[Object.cs]
看了对应的代码,小生认为这个类虽然没有继承System中的Object类,但是类中的静态方法都是extern了System.Object的对应方法的。所以说这个类是基于System.Object的同时也扩展了Unity部分的特性。同时这个类也就是Unity世界中所有物体的一个基类。
2. UnityEditor :
关于UnityEditor,这个与UnityEngine类似也是一个namespace。
BuildAssetBundleOptions :
这个值为定义于UnityEditor命名空间下的一个枚举类型,主要就是针对在打包的时候定义打包的对应参数。具体这里的值的使用请参照[打包基础篇],具体的对应值参照代码片。[BuildAssetBundleOptions.cs]
在打包篇中说到其中的一个值CompleteAssets,在这里小生重新看了一下资料也做了一些小实验。小生理解为在设定这个值为打包参数的时候,会强制把整个包导入打包。但是小生在上文的小球中一组设置了CompleteAssets和CollectDependencies,另一组没有设置CompleteAssets只是设置了CollectDependencies,然后分两次打包每次读如的时候通过断点调试来查看生成的gameobject,但是两个在MomoDevelop中的值通过比对看不出来有什么区别(要是区别唯一就是小生又制作了一个含有子元素的Prefab然后打包之后设定了CompleteAssets的比没设定的要多出2KB的大小,但是看Debug的内容没有看出有什么区别),所以看不出来到底这个参数到底起了什么作用。还请哪位大牛能否给讲解一下,小生不胜感激!!!
3. Selection :
此为定义于UnityEditor命名空间下的一个抽象类。具体代码内容请参见。[Selection.cs]
GetFiltered() :
此方法可以返回你在Project文件夹中选择的文件中你想取得的包含对象。其中这个方法的第一个参数是你想筛选取得的对象的类型,比如说我想取得选择文件中的Game Object, 这个时候就需要给第一个参数赋值上typeof(GameObject),第二参数设定的是检索的方式。这里是用到了一个枚举类型的值SelectionMode,这里小生给一个对象(包含子Game Object)用这个方法查看了一下,使用了[Assets,Deep,DeepAssets],但是发现除了Deep以外返回的值都是一样的。返回值都是一个GameObject的数组,里面只是包含了最上层的对象。而用Deep的时候就返回这个Game Object中所包含的所有子Game Object。小生这里就不太明白了,那Deep和DeepAssets到底有什么不同呢,哪位大牛能给小生解答一下疑问么?小生在这里先谢谢各位大牛了。
activeObject :
返回的就是你实际选择上的那个对象文件,比如说你选择了Prafeb,那就返回这个Prafeb放到Scene中那个GameObject的整体。(但是小生很奇怪,如何在MomoDevelop下看到一个GameObject包含的子Game Object呢?有啥好方法么?)
4. Application :
此为定义于UnityEngine空间命名之下一个抽象类。具体类的内容参见代码片[Application.cs]
dataPath :
使用这个参数可以返回你这个项目顶级的Assets目录的物理路径。
5. BuildPipeline :
此类为定义于UnityEditor命名空间下的一个抽象类。具体类的内容参见代码片[BuildPipeline.cs]
BuildAssetBundle() :
这个方法主要需要传入四个参数[MainAsset, assets, targetPath, BuildAssetBundleOrtions],第一个参数主要就是传入这个对象顶层对象,第二个参数就是传入这个对象包含的所有所有的自对象以及顶层本身,第三个参数是打包后存放的路径。第四个是打包的方式,请参见第二条的BuildAssetBundleOptions。
6. Caching :
此类为定义于UnityEngine命名空间下的一个抽象类。具体类的内容参见代码片[Caching.cs]
CleanCache() :
如果在项目运行中的时候你想把所有的下载完成的Asset Bundle的缓存都给清除掉的话,你可以使用这个。但是官方Api说这个方法不适用于WebPlayer,因为WebPlayer是使用的共享内存。
7. WWW :
此为定义于UnityEngine命名空间下的一个抽象类。具体类的内容参见代码片[WWW.cs]
assetBundle :
如果你下载的内容是含有Asset Bundle的话,通过调用这个变量你就可以获得WWW对象中Asset Bundle的内容。
assetBundle.mainAsset :
比如你下载了一个Prefab的Asset Bundle,那调用了mainAsset这个属性的话,你获得的就是这个整体的Prefab的对象。
assetBundle.load() :
传入Asset Bundle的名字来获得WWW下载下来的Asset Bundle对象。
assetBundle.Unload() :
此方法有一个布尔类型的参数,若传入的是false的话,就是当你读入完一个Asset Bundle之后,在Instantiate后,为了节省Asset Bundle加载束资源的话,你可以把这个文件存放的对应束节点进行Unload操作。这么做不会导致已经被instantiate的对象出现问题。
如果传入参数是true的话,已经Instantiate后的对象也会同时消失掉造成丢失。因为这是已经把这个文件存放的对应束节点已经给摧毁了。
8. StartCoroutine :
这个方法其实很是重要,但是需要大家实现了解关于“Coroutine[协程]”的定义,小生就在此卖卖关子,简单地和各位看官交流一下关于协程的一些理解吧[还请各位看官多多指教]。 小生认为协程就是你利用内存来模拟栈自己开辟出来一个进程,这个进程非主进程。类似于Web开发中的异步的方式。然后参数就是你传入的你要执行的方法。比如在执行和网络交互的WWW的时候获取对应的返回值是一定要在return前加上yield,类似于yield return www。
9. IEnumerator :
从代码来看其为声明在System.Collections命名空间下的一个接口。代码参见代码片[IEnumerator.cs],在Unity中实行协程的时候所执行的方法是必须要返回这个接口的类型的。
10. List :
这个就是小生自己复习用的了,由于接触C#实践不长(一直都是适用NSMutbaleArray(Swift,Objective-C)要不就是PHP的无敌数组),List了解的还不是很深刻,这次主要就是好好理解下List的用法。小生个人理解其实就是一个一维数组,但是这个数组里面的类型必须是要一致的,可以使字符串,数字,对象等等。只要在声明的时候List<T>要给声明称对应的类型就可以了。嘿嘿,这个T嘛其实还有一个意思就是泛型的意思,小生也是研究了一下,感觉挺有意思。如果对C#的Api感兴趣的话各位看官可以访问微软的官方Api[C#官方Api]
Contains() : 这个方法就是判断你传入的参数是否是在List中存在。返回的是布尔类型的值。
以上就是小生关于这些Api的一些看法,各位大牛是怎么认为的呢?基础打包小生已经和各位看官分享完了。但是可能有些看官想了,现在下载使用的是WWW,每次下载完事之后都是不会存在Client端的缓存上,这样会导致每次程序重启或者将其在内存中释放后都要重新下载,这样会耗费流量外加如果是多人使用的话还会在在高峰期造成大带宽占用的问题。
确实如此,所以Unity对应这个地方也有它的套路哦,小生就在这里留个引子,各位看官请关注小生的下一篇-----AssetBundle的缓存利用篇吧!