diff --git a/AssetStudio/StudioClasses/ModelConverter.cs b/AssetStudio/StudioClasses/ModelConverter.cs index 158a009..c397299 100644 --- a/AssetStudio/StudioClasses/ModelConverter.cs +++ b/AssetStudio/StudioClasses/ModelConverter.cs @@ -256,7 +256,7 @@ namespace AssetStudio var iMesh = new ImportedMesh(); meshR.m_GameObject.TryGetGameObject(out var m_GameObject2); m_GameObject2.m_Transform.TryGetTransform(out var meshTransform); - iMesh.Name = GetTransformPath(meshTransform); + iMesh.Name = GetMeshPath(meshTransform); iMesh.SubmeshList = new List(); var subHashSet = new HashSet(); var combine = false; @@ -539,7 +539,7 @@ namespace AssetStudio if (combine) { meshR.m_GameObject.TryGetGameObject(out var m_GameObject); - var frame = ImportedHelpers.FindFrame(m_GameObject.m_Name, FrameList[0]); + var frame = ImportedHelpers.FindChild(m_GameObject.m_Name, FrameList[0]); if (frame?.Parent != null) { var parent = frame; @@ -594,11 +594,10 @@ namespace AssetStudio return null; } - - private string GetTransformPath(Transform meshTransform) + private string GetMeshPath(Transform meshTransform) { meshTransform.m_GameObject.TryGetGameObject(out var m_GameObject); - var curFrame = ImportedHelpers.FindFrame(m_GameObject.m_Name, FrameList[0]); + var curFrame = ImportedHelpers.FindChild(m_GameObject.m_Name, FrameList[0]); var path = curFrame.Name; while (curFrame.Parent != null) { @@ -609,6 +608,17 @@ namespace AssetStudio return path; } + private string GetTransformPath(Transform transform) + { + transform.m_GameObject.TryGetGameObject(out var m_GameObject); + if (transform.m_Father.TryGetTransform(out var father)) + { + return GetTransformPath(father) + "/" + m_GameObject.m_Name; + } + + return m_GameObject.m_Name; + } + private ImportedMaterial ConvertMaterial(Material mat) { ImportedMaterial iMat; @@ -1022,7 +1032,7 @@ namespace AssetStudio { transformName = strs.Last(); var parentFrameName = strs[strs.Length - 2]; - parentFrame = ImportedHelpers.FindFrame(parentFrameName, rootFrame); + parentFrame = ImportedHelpers.FindChild(parentFrameName, rootFrame); } var skeletonPose = avatar.m_Avatar.m_DefaultPose; diff --git a/AssetStudioUtility/Imported.cs b/AssetStudioUtility/Imported.cs index 495f592..298ee8d 100644 --- a/AssetStudioUtility/Imported.cs +++ b/AssetStudioUtility/Imported.cs @@ -185,15 +185,27 @@ namespace AssetStudio { public static ImportedFrame FindFrame(string name, ImportedFrame root) { - ImportedFrame frame = root; - if ((frame != null) && (frame.Name == name)) + if (root.Name == name) { - return frame; + return root; } - - for (int i = 0; i < root.Count; i++) + foreach (var child in root) { - if ((frame = FindFrame(name, root[i])) != null) + var frame = FindFrame(name, child); + if (frame != null) + { + return frame; + } + } + return null; + } + + public static ImportedFrame FindChild(string name, ImportedFrame root) + { + foreach (var child in root) + { + var frame = FindFrame(name, child); + if (frame != null) { return frame; }