在上一篇文章中,我们大约是开始接触到资源加载的事情了,场景资源则是一个比较特殊的资源,我们只要添加到Build Settings里面,那么我们就可以通过API直接加载。
但是其他类型的资源怎么办呢?比如我们制作一个网络游戏,接收到后台的返回数据要求给人物装上一把枪,但是我们也不可能把所有枪都作为成员数据赋值上去,肯定是希望用到哪个就加载哪个,所以这个时候就需要支持通过类似名字或者路径的方式加载资源。
因此本章我们将会讲解Unity中资源到底是什么,如何进行加载的,以及几种加载方式适用的场景。
引用形式的加载
之前的篇章里面我们要使用某个资源,都是在代码中加入成员变量,借助Unity的序列化能力显示在编辑器面板上,然后我们通过拖拽等方式,将场景内的物体或者Project窗口里面的资源赋值到对应的变量上去,这种加载资源的方法是通过引用来进行加载的。
之前分析实际场景文件的时候我们有分析过,我们的GameObject也好,组件类也罢,在序列化的时候都会生成一个唯一的id,这个id就是用来存储引用关系,在场景启动的时候就会加载场景里面已有的GameObject,然后根据文件内的id数据来索引所有的引用关系。
但是有一个问题就是,我们之前其实有使用Prefab赋值给场景内物体的组件变量上,那这个引用关系又是如何呢?
我们不妨以文本方式打开Demo.unity文件,找到我们赋值bullet的FireController这个物体的FireController组件:
可以看到这里我们又见到了fileID,但是很显然这个fileID我们是无法在场景文件内搜索到第二个使用的地方,毕竟这里赋值的Prefab是存在于Project窗口里面而非场景里面,那么我们注意到后面还有一个guid,擅长全局搜索的朋友可能会尝试把整个Assets目录都搜索一遍,很快就能找到其实这个guid存在于Bullet.prefab.meta文件中: