Unity 资源打包机制

956 阅读2分钟

微信图片_20220824144205.jpg 当我们在BuildSetting中指定了需要打包的场景时,例如Scene1和Scene2。Unity只会将所有与场景相关的asset打包进最终的游戏中(与场景相关的asset指的:被场景直接或间接引用的asset)。而所有的孤儿asset,即用黄色圈标出的资源,由于没有被任何场景所引用(或者说使用),是不会被包含在最终的资源包中的。在上图中,带勾的asset会在Bulid过程中被包含进最终的资源包,而带黄圈的则不会。

同时需要注意的是,在一个场景中,只有与之相关的(被其引用)资源才可以在该场景中被使用。例如对Scene1中,只有带蓝色勾的asset才可以被其使用。而在Scene2中,只有带橙红色勾的asset才可以被其使用。虽然这些asset在游戏打包后都被包含在最终的资源包内。

这可以说是一种限制,在很多情况下将带来不便的影响,尤其是需要跨场景保持角色某些状态不变的情况下。 例如在Scene2中,我们在场景中引用了一个名为Player的Prefab,同时这个Prefab又引用了一个名为sword的asset,也就是说这个Player将以Sword(ScriptableObejct)作为武器。这时,如果试图从Scene2切换到Scene1,我们的确可以在触发场景切换的时候将Player对Sword-asset持有的引用作为一种Player的状态从而序列化,就如同其它任何player的状态一样。当成功切换到scen1的时候,在进行反序列化,将Player的状态复原。但是,问题在于,Scene1这个场景文件中并不包含对sword-asset任何直接或者间接的引用,这意味着它无法使用sword-asset,所以这个状态将无法复原。

这时,我们就需要Resources这个概念,以便在运行时动态的、独立于场景的加载所需asset。我们可以将所有我们认为需要独立(不依赖)于场景而存在的asset都放在Resources文件夹下。这样在最终的Build过程中,Resources文件夹下的asset将被打包进最终的游戏资源包中,即使该asset没有被任何场景所引用。并且在任意场景,当我们需要在运行时加载(Load)所需的asset时,我们可以通过Resources.Load(path)来动态的加载Resources文件夹下的asset。