【Unity3d】3d网页游戏场景打包与加载
3d游戏中 一个场景往往比较大 如果游戏的进行需要下载一个10M甚至更大的场景时 加载所用的时间会导致很大部分玩家的流失
我们知道unity3d中的内置地形是使用一张高度图 加载场景时 首先加载地形并显示 再去加载场景中的部件(比如树、房子等) 将会很有必要
在加载场景中的部件时 可以根据玩家当前所在的位置 由近到远的去加载
场景中的每个部件实际上并不都是独一无二的
比如一棵一模一样的树 可能同一个场景中出现在很多地方 不同的只是树的位置信息
那么在加载场景的时候则只需要加载一个树的模型 并记录下N个树的transform信息 将会大大的减少场景所占的空间
如果模型的重用率较高 那么这个问题的解决将会成倍的减少一个场景所占的空间
场景在加载时 也只需要下载一个树的模型 并根据transform信息 在指定的位置复制出N棵树即可
在使用unity3d的BuildPipeline进行打包之前 需要遍历一边所选文件夹下的场景文件
如果文件的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
当然这适用于场景中的模型有重用的现象