希望能够得到一些大佬的教学 本人自用 喜欢全自动动作 想自己做一个
感觉云图和碧蓝还有少前提取不一样 求解惑
云图计划,UnityCN制作,有单独的加密
可用于解密并提取资源
使用方式:终端打开,输入
AssetStudioCLI.exe your_input_folder your_output_folder --game UnityCN --key_index 4
可用于导出云图的live2d
使用方式:终端打开,输入
UnityLive2DExtractor.exe your_game_Live2D_path 4
更多用法可以带上-h参数
感谢 虽然我还是没能成功 还是谢谢你的支持
怎么个不成功法?
大佬你好 我使用了你提供的导出方法 导出的live2d文件我放到live2dex里发现没有动作文件 请问一下我是哪里搞错了?
这个还是提issue吧,我之前拆是没问题的,可能是云图又改了什么
你拆的哪个角色,我之前拆的时候也发现有些角色的动作文件不全,大概不是工具的问题,因为AS预览里也是缺动作文件,猜测是放到别的包里了
我提取的是晨曦的 放到其他位置了的话就只能慢慢找了
朋友你好,我已经下完了最新版的assetaudio,在我点击AssetStudioCLI.exe,出现了闪退情况,报错信息如下:第一行报错信息:“Option’ --game is required ” 第二行和第三行报错信息都是:“Required argument missing for command :“AssetStudio.CLI””。请问我是哪一步弄错了吗
在文件夹上面的地址栏全选并输入cmd,即可以这个文件夹为路径打开cmd终端,接着执行我上面的命令即可,需要电脑有足够大的内存,也可以加参数限定导出资源类型,具体的用-h参数看帮助吧
解决这个动作文件导不出这个问题了,写了一段node.js代码(本人不怎么会python)用来转换fade.json。首先使用上面提到的assetstudio提取fade.json。然后node.js代码会递归读取以fade.json结尾的文件,设置其名称为xx,他的全名为xx.fade.json,修正后在所在文件夹生成一个xx.motion3.json文件
物理文件这是递归读取CubismPhysicsController.json文件,然后在所在文件夹生成l2d.physics3.json文件
然后注意一下,动作文件变化曲线一共是3种,本代码仅仅对0和2进行处理,对1没有处理。处理其他游戏时可能会出现偏差。
import fs from 'fs'
import path from 'path'
function processFadeFiles(dirPath) {
const files = fs.readdirSync(dirPath);
for (const file of files) {
const filePath = path.join(dirPath, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
processFadeFiles(filePath);
} else if (file.endsWith('.fade.json')) {
const fileName = path.basename(file, '.fade.json');
const data = fs.readFileSync(filePath, 'utf8');
const obj = JSON.parse(data);
const motion3Json = {
'Version': 3,
"Meta": {
"Duration": 0.000,
"Fps": 60.0,
"Loop": true,
"AreBeziersRestricted": true,
"CurveCount": 0,
"TotalSegmentCount": 0,
"TotalPointCount": 0,
"UserDataCount": 1,
"TotalUserDataSize": 0
},
"Curves": [],
"UserData": [
{
"Time": 0.0,
"Value": ""
}
]
};
// motion3Json.Meta.TotalSegmentCount = obj.ParameterIds * 10
// motion3Json.Meta.TotalSegmentCount = obj.ParameterIds * 15
let TotalSegmentCount = 0
let maxTime = 0.0
for (let i = 0; i < obj.ParameterCurves.length; i++) {
let Segments = []
for (let j = 0; j < obj.ParameterCurves[i].m_Curve.length; j++) {
TotalSegmentCount++;
Segments.push(obj.ParameterCurves[i].m_Curve[j].time ?? 0)
Segments.push(obj.ParameterCurves[i].m_Curve[j].value ?? 0)
Segments.push(obj.ParameterCurves[i].m_Curve[j].weightedMode ?? 0)
maxTime = maxTime > obj.ParameterCurves[i].m_Curve[j].time ? maxTime : obj.ParameterCurves[i].m_Curve[j].time
}
Segments.pop()
motion3Json.Curves.push({
"Target": "Parameter",
"Id": obj.ParameterIds[i],
"Segments": Segments
})
}
motion3Json.Meta.CurveCount = obj.ParameterIds.length
motion3Json.Meta.Duration = maxTime
motion3Json.Meta.TotalSegmentCount = TotalSegmentCount
motion3Json.Meta.TotalPointCount = obj.ParameterIds.length + TotalSegmentCount
fs.writeFileSync(path.join(dirPath, `${fileName}.motion3.json`), JSON.stringify(motion3Json, '\t'));
console.log(path.join(dirPath, `${fileName}.motion3.json`) + "已生成");
} else if (file.endsWith('CubismPhysicsController.json')) {
const data = fs.readFileSync(filePath, 'utf8');
const obj = JSON.parse(data);
let physicsJson = {
"Version": 3,
"Meta": {
"PhysicsSettingCount": 0,
"TotalInputCount": 0,
"TotalOutputCount": 0,
"VertexCount": 0,
"Fps": 0,
"EffectiveForces": {
},
"PhysicsDictionary": [
]
},
"PhysicsSettings": []
}
physicsJson.Meta.EffectiveForces.Gravity = obj?._rig?.Gravity
physicsJson.Meta.EffectiveForces.Wind = obj?._rig?.Wind
physicsJson.Meta.Fps = obj._rig.Fps ?? 60
for (let i = 0; i < obj._rig?.SubRigs?.length ?? 0; i++) {
let physicsSetting = {
"Id": "PhysicsSetting",
"Input": [
],
"Output": [
],
"Vertices": [
],
"Normalization": {
}
}
let rig = obj._rig.SubRigs[i]
physicsSetting.Id = physicsSetting.Id + (i + 1)
physicsJson.Meta.PhysicsDictionary.push({
"Id": physicsSetting.Id,
"Name": i + 1 + ""
})
for (let j = 0; j < rig?.Input.length ?? 0; j++) {
physicsSetting.Input.push({
"Source": {
"Target": "Parameter",
"Id": rig.Input[j].SourceId
},
"Weight": rig.Input[j].Weight,
"Type": rig.Input[j].AngleScale || rig.Input[j].AngleScale === 0 ? "Angle" : "X",
"Reflect": false
})
}
for (let j = 0; j < rig?.Output.length ?? 0; j++) {
physicsSetting.Output.push({
"Destination": {
"Target": "Parameter",
"Id": rig.Output[j].DestinationId
},
"VertexIndex": 1,
"Scale": rig.Output[j].AngleScale ?? 1,
"Weight": rig.Output[j].Weight,
"Type": rig.Output[j].AngleScale || rig.Output[j].AngleScale === 0 ? "Angle" : "X",
"Reflect": false
})
}
for(let j = 0; j < rig?.Particles?.length; j++) {
physicsSetting.Vertices.push( {
"Position": rig?.Particles[j].InitialPosition,
"Mobility": rig?.Particles[j].Mobility,
"Delay": rig?.Particles[j].Delay,
"Acceleration": rig?.Particles[j].Acceleration,
"Radius": rig?.Particles[j].Radius
})
}
physicsSetting.Normalization = rig.Normalization
physicsJson.PhysicsSettings.push(physicsSetting)
}
fs.writeFileSync(path.join(dirPath, `l2d.physics3.json`), JSON.stringify(physicsJson, '\t'));
console.log(path.join(dirPath, `l2d.physics3.json`) + "已生成");
}
}
}
processFadeFiles("D:\\新建文件夹\\chromeDnowload\\UnityCNLive2DExtractor\\Live2DOutput\\assets\\res\\character\\persicaria_p3\\l2d");
大佬,从res文件中用你的方式解包出
.png , .bytes, .shader, .obj , .dat , .ttf ,.fbx , .anim
这些格式的文件,导入AssetStudioGui软件,报错no unity file can be loaded.
是因为so加密吗,用上面的方式未解密成功,解析出来的是文件缺失,go.dat这个文件我看了下没有加密。
在解析动物这些文件中也没有发现live2d文件啦
麻烦大佬看看,是因为云图计划的key变了吗,还是什么原因。愿解惑
能用这个工具拆出来就说明key没有变,AssetStudio需要导入的是 UnityFs标头的 ab 文件,你这都拆出来的肯定不能再导回去啊(
那大佬,用AssetStudiocll出来的这些文件。
IMG_20231112_021208
又该如何处理,能得到我想要live2d文件。或者用什么软件
结合这两个来看
上面的工具导出后没有motions,然后你再用下面这个佬的脚本转换
大佬,我还是没看懂。
这个
,需要live2d的路径,用AssetStudiocll导出的文件没有live2d文件的。源文件ab包加密没办法直接AssetStudiogui,导入就报no filad…untiy 那个错误。下面的代码中要导入AssetStudiogui中导出·josn文件。但没办法导入呀
大佬,那个your_game_Live2D_path,是指未编译前游戏路径内只要是res文件下live2d文件吗
对,这个工具就是专门为UnityCN游戏设计的
res文件夹的所有文件名称
camera
character (这里有2个多g)
dormfight
effect
fairy
fonts
images
language
materials
model(这里有400mb)
packscenes
scenes
scriptableconfig
spriteatlas
TextAsset
uiprefabs
warchess
C:\Users\asn12\Nox_share\Download\com.sunborn.neuralcloud.cn.bilibili\files\bundles\res
我想知道之前大佬拆云图文件夹路径是否一样,我在里面找了半天就是没有看到live2d文件。