http://www.cnblogs.com/dosomething/archive/2012/04/07/2436353.htmlhtml
3d游戏中 一个场景每每比较大 若是游戏的进行须要下载一个10M甚至更大的场景时 加载所用的时间会致使很大部分玩家的流失ui
咱们知道unity3d中的内置地形是使用一张高度图 加载场景时 首先加载地形并显示 再去加载场景中的部件(好比树、房子等) 将会颇有必要spa
在加载场景中的部件时 能够根据玩家当前所在的位置 由近到远的去加载3d
场景中的每一个部件实际上并不都是独一无二的 code
好比一棵如出一辙的树 可能同一个场景中出如今不少地方 不一样的只是树的位置信息 orm
那么在加载场景的时候则只须要加载一个树的模型 并记录下N个树的transform信息 将会大大的减小场景所占的空间 htm
若是模型的重用率较高 那么这个问题的解决将会成倍的减小一个场景所占的空间blog
场景在加载时 也只须要下载一个树的模型 并根据transform信息 在指定的位置复制出N棵树便可游戏
在使用unity3d的BuildPipeline进行打包以前 须要遍历一边所选文件夹下的场景文件 ip
若是文件的MeshFilter的Mesh为在该文件夹中只出现了一次 则说明该模型在场景中没有重复 则记录下该模型文件的transform信息 并打包
若是该Mesh出现的次数大于一次 则记录下这些和该Mesh相同的模型的transform信息 打包时包含一个模型和多个transform信息
在unity3d中有个名为ScriptableObject的类 能够利用它来存储本身所需的各类各样的资源
public class TransformHolder : ScriptableObject
{
public int Length;
public Vector3[] position;
public Quaternion[] eulerAngles;
public Vector3[] localScale;
}
这样一来 每个资源包中都包含一个模型和一个TransformHolder类型的文件
TransformHolder的Length若为1 则说明该模型在场景中只出现了一次
若大于1 则能够根据记录的transform信息循环生成多个
原先有几百个资源包 大小有十几兆的场景
用该方法后 变成了二十多个资源包 大小减小到不足2M
固然这适用于场景中的模型有重用的现象