Please use UnityLive2DExtractor
碧蓝航线Live2D提取
使用方法:拖放Live2D文件到exe上
代码偷懒,转换逻辑Unity下的Cubism 3通用
OBSOLETE - see readme / 碧蓝航线Live2D提取
License: MIT License
Please use UnityLive2DExtractor
碧蓝航线Live2D提取
使用方法:拖放Live2D文件到exe上
代码偷懒,转换逻辑Unity下的Cubism 3通用
大佬,我尝试使用您的软件解少女咖啡枪,结果在Cubism3Viewer打开是这样的
使用了Cubism3SDK后在unity里是这样的
更有甚者是直接让Cubism3Viewer崩溃的,请问这是Cubism3的原因吗
l2d01.zip
fu'sha附上文件
Current implementation is hardcoded to UserDataCount=0 and TotalUserDataSize=0.
But according to Unity SDK it converts motion's user data to AnimationEvent related to motion's AnimationClip. Where event's time is UD time and stringParameter is value.
In Azur Lane's L2D setup all motions except idle has an animation even that calls OnFinishAnim with motion id as arg. Which runs idle animation by default.
Azur Lane got a Update and i Can't Extract the files anymore.
older files works just fine.
ハンドルされていない例外: SevenZip.DataErrorException: Data Error
場所 SevenZip.Compression.LZMA.Decoder.Code(Stream inStream, Stream outStream, Int64 inSize, Int64 outSize, ICodeProgress progress)
場所 AssetStudioCore.SevenZipHelper.StreamDecompress(Stream inStream, Stream outStream, Int64 inSize, Int64 outSize)
場所 AssetStudioCore.BundleFile.ReadFormat6(EndianBinaryReader bundleReader, Boolean padding)
場所 AssetStudioCore.BundleFile..ctor(String path, EndianBinaryReader bundleReader)
場所 AzurLaneLive2DExtract.Program.Main(String[] args)
this error show on logs when i try to open .moc3 with Cubism 3 Viewer(for OC), what did i do wrong?
�[1;31mERROR �[m�[1m[ Exception in thread "AWT-EventQueue-0" net.arnx.jsonic.JSONException: fails to convert {Version=3, FileReferences={Moc=huonululu_3.moc3, Textures=[textures/texture_00.png], Motions=[motions/mission.motion3.json, motions/mail.motion3.json, motions/touch_special.motion3.json, motions/main_1.motion3.json, motions/main_3.motion3.json, motions/touch_head.motion3.json, motions/home.motion3.json, motions/idle.motion3.json, motions/login.motion3.json, motions/wedding.motion3.json, motions/complete.motion3.json, motions/touch_body.motion3.json, motions/main_2.motion3.json, motions/mission_complete.motion3.json], Physics=huonululu_3.physics3.json}, Groups=[{Target=Parameter, Name=LipSync, Ids=[ParamMouthOpenY]}, {Target=Parameter, Name=EyeBlink, Ids=[ParamEyeLOpen, ParamEyeROpen]}]} to class com.live2d.cubism.doc.model.exporter.bv$d: $.FileReferences.Motions[0][0] ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON$Context.convertInternal(JSON.java:1775) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON.parse(JSON.java:1182) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON.parse(JSON.java:1170) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON.decode(JSON.java:707) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.model.exporter.bv$h.a(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.a.b$a.a(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.OWViewerDropFrame.openModel3Json(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.OWViewerDropFrame.openMoc(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.OWViewerDropFrame.openFile(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.OWViewerDropFrame.access$openFile(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.U.a(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.U.invoke(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.util.W.c(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.OWViewerDropFrame.openAs(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.OWViewerDropFrame.access$openAs(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.J.a(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.cubism.doc.modeling.ui.viewerForOriginalWorkflow.J.invoke(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.ui.control.d.a(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.ui.control.d.invoke(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.ui.menu.CMenuItem.doAction_exe(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at com.live2d.ui.control.c.actionPerformed(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at javax.swing.DefaultButtonModel.setPressed(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at javax.swing.AbstractButton.doClick(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.Component.processMouseEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at javax.swing.JComponent.processMouseEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.Component.processEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.Container.processEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.Component.dispatchEventImpl(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.Container.dispatchEventImpl(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.Component.dispatchEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.Container.dispatchEventImpl(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.Window.dispatchEventImpl(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.Component.dispatchEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventQueue.dispatchEventImpl(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventQueue.access$500(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventQueue$3.run(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventQueue$3.run(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.security.AccessController.doPrivileged(Native Method) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventQueue$4.run(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventQueue$4.run(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.security.AccessController.doPrivileged(Native Method) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventQueue.dispatchEvent(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventDispatchThread.pumpEvents(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventDispatchThread.pumpEvents(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at java.awt.EventDispatchThread.run(Unknown Source) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ Caused by: java.lang.UnsupportedOperationException: Cannot convert class java.lang.String to class com.live2d.cubism.doc.model.exporter.bv$g ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.ObjectConverter.convert(Converter.java:1676) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON.postparse(JSON.java:1310) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON$Context.postparseInternal(JSON.java:1754) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.CollectionConverter.convert(Converter.java:1472) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON.postparse(JSON.java:1310) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON$Context.postparseInternal(JSON.java:1754) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.MapConverter.convert(Converter.java:1589) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON.postparse(JSON.java:1310) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON$Context.postparseInternal(JSON.java:1754) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.ObjectConverter.convert(Converter.java:1650) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON.postparse(JSON.java:1310) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON$Context.postparseInternal(JSON.java:1754) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.ObjectConverter.convert(Converter.java:1650) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON.postparse(JSON.java:1310) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ at net.arnx.jsonic.JSON$Context.convertInternal(JSON.java:1762) ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
�[1;31mERROR �[m�[1m[ ... 58 more ]�[m �[1;31mat jp.noids.ui.c.f$a (f$a.kt:-1) write()�[m
我想先解包修改完资源后再封包到游戏里面运行
model3.json中,按照Cubism 3规范,Motions的值必须为对象而非数组。
一些浏览程序并不支持数组。
{
"Version": 3,
"FileReferences": {
"Moc": "banrenma_2.moc3",
"Textures": [
"textures/texture_00.png"
],
"Motions": {
"Idle": [
{"File":"motions/idle.motion3.json"},
{"File":"motions/home.motion3.json"},
{"File":"motions/main_1.motion3.json"}
],
"TapBody": [
{"File":"motions/touch_body.motion3.json"},
{"File":"motions/touch_special.motion3.json" },
{"File":"motions/touch_head.motion3.json"},
{"File":"motions/main_2.motion3.json"}
]
},
"Physics": "banrenma_2.physics3.json"
},
//...
程序代码生成motion3.json时没有计算TotalSegmentCount和TotalPointCount的值。
每条Curve由Segment和Point组成。
Segment有4种:线性曲线(Linear=0)、贝赛尔曲线(Bezier=1)、阶梯曲线(Stepped=2)、反向阶梯曲线(InverseStepped=3)。
"Segments": [
0, //点(0,1)
1,
0, //线性曲线
1, //点(1,0)
0,
0, //线性曲线
4.8, //点(4.8,1)
1
]
参考CubismMotionSegmentType和CubismMotion::parse(),计算方式如下
totalPointCount = 0;
totalSegmentCount = 0;
foreach (var curve in curves)
{
for (var segmentPosition = 0; segmentPosition < curve.Segments.Count; )
{
if (segmentPosition == 0)
{
totalPointCount += 1;
segmentPosition += 2;
}
var segment = (int)curve.Segments[segmentPosition];
switch (segment)
{
//case Linear:
case 0:
totalPointCount += 1;
segmentPosition += 3;
break;
//case Bezier:
case 1:
totalPointCount += 3;
segmentPosition += 7;
break;
//case Stepped:
case 2:
totalPointCount += 1;
segmentPosition += 3;
break;
//case InverseStepped:
case 3:
totalPointCount += 1;
segmentPosition += 3;
break;
default:
throw new Exception($"Unknown segment type of the curve.");
}
totalSegmentCount++;
}
}
I only tested Ark Royal's Live2D, so this may or may not affect others. I'm using the EN client currently, and when you extract the Live2D and use a program such as Live2DViewerEX on Steam to edit and check the motions, there are a few where her arm will disappear during the motion or something. This happened on Yukariin's fork. Perfare's version, during the login animation, one of her legs would be completely off center.
I've seen something similar to this before when I was originally working on these models, like Atago for instance. Sometimes her animations wouldn't properly work because of the decryption not working fully, but once I got new files from a friend of mine with an updated program, it worked fine afterwards. If need be, I can upload the decrypted asset for Ark Royal to poke around with.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.