Unity3d中动态资源读取,除了Resources.Load方式。还有就是Assetbundle。
Assetbundle的各方面介绍,这里就不在赘述,网上搜搜就一大片。但是,是不是什么东西都能被打成Assetbundle呢?
基本上,引用到的资源,都能被打成Assetbundle。但是脚本和shader却不一样,虽然脚本和shader也能被导入Assetbundle。但是却不能把源文件导入(如果Assetbundle中存的是脚本的源文件,那也就没那么多热更新解决方案了)。最简单的验证方法,把一个项目的一个场景,导出Assetbundle,另一个项目读取这个Assetbundle运行。会发现资源都导入了,却没有执行的脚本。
因此,如果两个项目,想通过Assetbundle方式,来合并两个项目,那就必须把脚本也拷到要被导入的项目中。两个项目脚本合并,难免出现重名的脚本,重名的类。为了解决这个,每个项目,定一个唯一的namespace。如果项目开始的时候就定好了,那还好办,如果后期合并,前期都没加过。那就只能自己写个Editor脚本,批量加上。
Unity项目中,难免使用一些全局的设置,比如,Physic重力设置,Tag和Layer这些。重力还好办,项目运行起来,还能通过脚本修改。但是Tag,Layer却不行。只能想办法进行合并。
Unity中,Tag只能通过string修改。但是,导成Assetbundle之后,其存储是index。所以要么在合并Tag的时候,要么批量修改,要么写个映射。当然,最好的方式是,项目统一用一套Tag。
Layer相比于Tag要简单许多,Layer可以通过int修改。Unity最大有32个Layer,即使你不添加Layer,也能通过修改Layer的index来使用。那么只要工程中定义全局使用的Layer即可
public class ProjectLayers
{
public const int Default = 0;
public const int TransparentFX = 1;
public const int IgnoreRaycast = 2;
public const int Water = 4;
public const int UI = 5;
public const int DefaultAdd = 9;
public const int Road = 10;
}
gameObject.layer = ProjectLayers.DefaultAdd;
由于项目的资源都是Assetbundle,那么打包的时候,Unity会自动帮你精简项目。所以,Shader和脚本,就有可能被精简掉。
所以保险起见,吧项目中所有的Shader全部添加到
Unity的脚本也得进行相应的设置