laya3dfilemerge
介绍
将laya从u3d中导出的描述文件(lh,ls,lmat)等,合并为一个json文件,并且在laya中,自己解析,使得加载小文件的数量降到最低,ls也许比较大,可以自行决定是否合并进json文件。
更新列表
安装教程
- npm i laya3dfilemerge -g
使用说明
- 在想要生成二进制文件的目录中(描述文件的主目录:bin/res/d3/assets/xxx/...,我们可以选择在d3目录下),shift+右键,选择在此处打开PowerShell窗口
- 输入:
laya3dm -e lh,lmat,ls [-o 输出的目录] [-p 需要的前缀]
,即可将本目录及子目录的描述文件都合并了(推荐使用此方式) 注意那个-e
,输出的目录可以不写,就是输出到原地,输出前缀也可以不写,这个前缀指的是生成的文件中,key的前缀,因为在本目录下,也许需要的是父级目录的前缀。
// 示例
laya3dm -e lh,lmat -i D:\work\xxx\bin\res\d3 -o D:\work\xxx\bin\res\d3 -p res/d3 -n d3file.json -d false
-e 需要合并的文件扩展名列表 (必需参数)
-i 输入目录,没有就默认是当前打开powershell的目录 (最好有)
-o 输出目录,没有就默认是输入目录
-p 写文件时,每个key前加的前缀,不需要就不用加这个参数 (看情况自己加)
-n 最终输出文件名,默认是: d3file.json
-d 是否删除需要合并的文件,不需要删除就不用加这个参数(慎用)
-ot 需要读取和导出的文件类型,默认json,二进制为bin
-s 文件大小限制,单位为KB,即:小于这个数值的文件才合并
// 得到的结果 d3file.bin(其实是个json文件)
{
"res/d3/zidansmoke.lh":"{\"version\":\"xxx\",...}",
....
}
// 使用方法:
// 注意,一定要先加载d3file.json文件才行。
let res = [{ url: "res/d3/d3file.json", type: Laya.Loader.JSON }]
Laya.loader.load(res, Laya.Handler.create(this, () => {
let d3res = Laya.loader.getRes('res/d3/d3file.json')
for (let key in d3res) {
let url = Laya.URL.formatURL(key);
if (!Laya.Loader.preLoadedMap[url]) {
let str = d3res[key];
let obj = JSON.parse(str);
// 这里要将数据放入预加载的hash中,其他代码不需要修改
Laya.Loader.preLoadedMap[url] = obj;
}
}
// todo 这里再去加载其他的3d资源
})
- 输入:
laya3dm -e lani,lm [-ot 输出的格式] [-s 限制多小的文件合并(单位KB)]
,即可将本目录及子目录的二进制文件都合并了 注意那个-e
,-ot
的参数可以不写,默认为json格式,如果是二进制,传bin
// 示例
laya3dm -e lani -i D:\work\xxx\bin\res\d3 -ot bin -p res/d3 -n d3lani.bin -s 40
laya3dm -e lm -i D:\logs\d3 -e lm -n d3lm.bin -ot bin -p res/d3 -s 20
-e 需要合并的文件扩展名列表 (必需参数)
-d 这个需要慎用
// 加载完毕bin文件后,需要进行以下处理
function pasred3bin(d3bin){
let b = new Laya.Byte(d3bin)
let len = b.readUint32()
let str = b.readUTFBytes(len)
let descJson = JSON.parse(str);
let oldPos = b.pos;
for (let key in descJson) {
let url = Laya.URL.formatURL(key);
if (!Laya.Loader.preLoadedMap[url]) {
let obj = descJson[key];
b.pos = obj.start + oldPos;
let buf = b.readArrayBuffer(obj.end + oldPos)
Laya.Loader.preLoadedMap[url] = buf;
Laya.Loader.preLoadedMap[key] = buf;
}
}
}