diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 6d93f7f..f871877 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -74,6 +74,11 @@ namespace AssetStudio filteredAssetTypesList.Add(ClassIDType.Texture2D); filteredAssetTypesList.Add(ClassIDType.SpriteAtlas); } + if (classIDTypes.Contains(ClassIDType.Animator)) + { + filteredAssetTypesList.Add(ClassIDType.AnimatorController); + filteredAssetTypesList.Add(ClassIDType.AnimatorOverrideController); + } filteredAssetTypesList.UnionWith(classIDTypes); } diff --git a/AssetStudio/CubismModel.cs b/AssetStudio/CubismModel.cs index c45a3b5..0fc9ed5 100644 --- a/AssetStudio/CubismModel.cs +++ b/AssetStudio/CubismModel.cs @@ -15,6 +15,7 @@ namespace AssetStudio public List ParamDisplayInfoList { get; set; } public List PartDisplayInfoList { get; set; } public List PosePartList { get; set; } + public List ClipMotionList { get; set; } public GameObject ModelGameObject { get; set; } public CubismModel(GameObject m_GameObject) @@ -26,6 +27,7 @@ namespace AssetStudio ParamDisplayInfoList = new List(); PartDisplayInfoList = new List(); PosePartList = new List(); + ClipMotionList = new List(); } } } diff --git a/AssetStudioCLI/Options/CLIOptions.cs b/AssetStudioCLI/Options/CLIOptions.cs index f50fb25..95216af 100644 --- a/AssetStudioCLI/Options/CLIOptions.cs +++ b/AssetStudioCLI/Options/CLIOptions.cs @@ -586,6 +586,7 @@ namespace AssetStudioCLI.Options o_exportAssetTypes.Value = new List { ClassIDType.AnimationClip, + ClassIDType.Animator, ClassIDType.MonoBehaviour, ClassIDType.Texture2D, }; diff --git a/AssetStudioCLI/Studio.cs b/AssetStudioCLI/Studio.cs index 7c943cb..b3fb587 100644 --- a/AssetStudioCLI/Studio.cs +++ b/AssetStudioCLI/Studio.cs @@ -295,6 +295,7 @@ namespace AssetStudioCLI if (m_GameObject.CubismModel != null && TryGetCubismMoc(m_GameObject.CubismModel.CubismModelMono, out var mocMono)) { l2dModelDict[mocMono] = m_GameObject.CubismModel; + BindAnimationClips(m_GameObject); } break; case Animator m_Animator: @@ -940,6 +941,34 @@ namespace AssetStudioCLI } } + private static void BindAnimationClips(GameObject gameObject) + { + if (gameObject.m_Animator == null || gameObject.m_Animator.m_Controller.IsNull) + return; + + if (!gameObject.m_Animator.m_Controller.TryGet(out var controller)) + return; + + AnimatorController animatorController; + if (controller is AnimatorOverrideController overrideController) + { + if (!overrideController.m_Controller.TryGet(out animatorController)) + return; + } + else + { + animatorController = (AnimatorController)controller; + } + + foreach (var clipPptr in animatorController.m_AnimationClips) + { + if (clipPptr.TryGet(out var m_AnimationClip)) + { + gameObject.CubismModel.ClipMotionList.Add(m_AnimationClip); + } + } + } + private static Transform GetRootTransform(Transform m_Transform) { if (m_Transform == null) diff --git a/AssetStudioGUI/Studio.cs b/AssetStudioGUI/Studio.cs index 86b51c5..e26140d 100644 --- a/AssetStudioGUI/Studio.cs +++ b/AssetStudioGUI/Studio.cs @@ -236,6 +236,7 @@ namespace AssetStudioGUI if (m_GameObject.CubismModel != null && TryGetCubismMoc(m_GameObject.CubismModel.CubismModelMono, out var mocMono)) { l2dModelDict[mocMono] = m_GameObject.CubismModel; + BindAnimationClips(m_GameObject); } break; case Texture2D m_Texture2D: @@ -1075,6 +1076,34 @@ namespace AssetStudioGUI } } + private static void BindAnimationClips(GameObject gameObject) + { + if (gameObject.m_Animator == null || gameObject.m_Animator.m_Controller.IsNull) + return; + + if (!gameObject.m_Animator.m_Controller.TryGet(out var controller)) + return; + + AnimatorController animatorController; + if (controller is AnimatorOverrideController overrideController) + { + if (!overrideController.m_Controller.TryGet(out animatorController)) + return; + } + else + { + animatorController = (AnimatorController)controller; + } + + foreach (var clipPptr in animatorController.m_AnimationClips) + { + if (clipPptr.TryGet(out var m_AnimationClip)) + { + gameObject.CubismModel.ClipMotionList.Add(m_AnimationClip); + } + } + } + private static Transform GetRootTransform(Transform m_Transform) { if (m_Transform == null) diff --git a/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs b/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs index 6e07652..f125d18 100644 --- a/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs +++ b/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs @@ -75,7 +75,7 @@ namespace CubismLive2DExtractor PhysicsMono = Model.PhysicsController; if (searchFadeMotions && TryGetFadeList(Model.FadeController, out var fadeMono)) { - FadeMotionLst = selFadeMotionLst = fadeMono; + FadeMotionLst = fadeMono; } if (TryGetExpressionList(Model.ExpressionController, out var expressionMono)) { @@ -107,6 +107,10 @@ namespace CubismLive2DExtractor PoseParts = Model.PosePartList; searchPoseParts = false; } + if (Model.ClipMotionList.Count > 0 && selClipMotions == null) + { + AnimationClips = Model.ClipMotionList; + } } foreach (var asset in assetGroupKvp.Value) { @@ -205,6 +209,10 @@ namespace CubismLive2DExtractor { Texture2Ds = renderTextureSet.ToList(); } + if (AnimationClips.Count > 0) + { + AnimationClips = AnimationClips.Distinct().ToList(); + } } public void ExtractCubismModel(string destPath, Live2DMotionMode motionMode, bool forceBezier = false, int parallelTaskCount = 1)