public override void OnInspectorGUI() { base.OnInspectorGUI(); var r = this.target as NsSkeletonRender; if (r != null) { if (Application.isPlaying) { if (GUILayout.Button("导出当前Mesh")) { var mesh = r.RunTimeMesh; if (mesh != null) { List <Mesh> lst = new List <Mesh>(); lst.Add(mesh); Renderer[] rlst = new Renderer[1]; rlst[0] = r.GetComponent <Renderer>(); ExportCollada.Export(lst, rlst, "Assets/NsSkeleton_RunTime.dae"); } } } } }
private void dumpCOLLADAFileToolStripMenuItem_Click(object sender, EventArgs e) { sfdColladaDae.FileName = string.Format("{0}.dae", modelFile.Root.CmbName); if (sfdColladaDae.ShowDialog() == System.Windows.Forms.DialogResult.OK) { ExportCollada.Export(sfdColladaDae.FileName, modelFile.Root); foreach (TexChunk.Texture tex in modelFile.Root.TexChunk.Textures) { string texPath = Path.Combine(Path.GetDirectoryName(sfdColladaDae.FileName), string.Format("{0}_{1:X}.png", tex.Name, tex.DataOffset)); tex.TexImage.Save(texPath, System.Drawing.Imaging.ImageFormat.Png); } } }
// 合并SkinedMesh到MESH void CombineSkinedMeshes(int sel = 0) { #if UNITY_EDITOR if (m_SelGameObj == null || m_SelSkinMehes == null || m_SelSkinMehes.Length <= 0) { Debug.LogError("选中合并对象为NULL"); return; } string filePath = string.Empty; if (sel != 4) { filePath = AssetDatabase.GetAssetPath(m_SelGameObj); if (string.IsNullOrEmpty(filePath)) { string scenePath = AssetDatabase.GetAssetOrScenePath(m_SelGameObj); if (!string.IsNullOrEmpty(scenePath)) { #if !UNITY_5_3 filePath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(m_SelGameObj); #endif if (string.IsNullOrEmpty(filePath)) { Debug.LogError("选中对象文件路径为空"); return; } } } } List <Mesh> meshList = new List <Mesh>(); for (int i = 0; i < m_SelSkinMehes.Length; ++i) { var sklMesh = m_SelSkinMehes[i]; if (sklMesh != null) { Mesh mesh = null; MeshRenderer mR = sklMesh as MeshRenderer; if (mR != null) { MeshFilter mF = mR.GetComponent <MeshFilter>(); if (mF != null) { mesh = mF.sharedMesh; } } else { SkinnedMeshRenderer smR = sklMesh as SkinnedMeshRenderer; if (smR != null) { if (sel == 2) { mesh = new Mesh(); smR.BakeMesh(mesh); } else { mesh = smR.sharedMesh; } } } if (mesh != null) { meshList.Add(mesh); } //var mesh = new Mesh(); //sklMesh.BakeMesh(mesh); //meshList.Add(mesh); } } if (sel == 0) { filePath = Path.ChangeExtension(filePath, ".dae"); ExportCollada.Export(meshList, m_SelSkinMehes, filePath); } else if (sel == 1) { ExportCollada.ExportSklsToAsset(m_SelSkinMehes, filePath); } else if (sel == 2) { string fileName = Path.GetFileNameWithoutExtension(filePath); filePath = string.Format("{0}/{1}_bakedMesh.dae", Path.GetDirectoryName(filePath), fileName); ExportCollada.Export(meshList, m_SelSkinMehes, filePath); if (meshList != null) { for (int i = 0; i < meshList.Count; ++i) { var mesh = meshList[i]; if (mesh != null) { GameObject.DestroyImmediate(mesh); } } meshList.Clear(); } } else if (sel == 3) { // 合并动画到贴图 filePath = Path.GetDirectoryName(filePath); ExportCollada.ExportAnimToTex(meshList, m_SelSkinMehes, m_SelClip, filePath); } else if (sel == 4) { // bindPose转TPose for (int j = 0; j < m_SelSkinMehes.Length; ++j) { SkinnedMeshRenderer sklRender = m_SelSkinMehes[j] as SkinnedMeshRenderer; if (sklRender != null) { Mesh mesh = GameObject.Instantiate <Mesh>(sklRender.sharedMesh); Matrix4x4[] bindposes = mesh.bindposes; Transform[] bones = sklRender.bones; // 按照的bone的位置重新计算bindpose for (int i = 0; i < bones.Length; ++i) { /* * 因为有可能外部进行了缩放或者其他变换,bone.worldToLocalMatrix有节点影响,所以要返乘一个变换sklRender.transform.localToWorldMatrix */ bindposes[i] = bones[i].worldToLocalMatrix * sklRender.transform.localToWorldMatrix; } mesh.bindposes = bindposes; // 赋值新的mesh sklRender.sharedMesh = mesh; } } } // ExportCollada.ExportToScene(meshList, m_SelSkinMehes); AssetDatabase.Refresh(); #endif }
// 合并SkinedMesh到MESH void CombineSkinedMeshes(int sel = 0) { #if UNITY_EDITOR if (m_SelGameObj == null || m_SelSkinMehes == null || m_SelSkinMehes.Length <= 0) { Debug.LogError("选中合并对象为NULL"); return; } string filePath = AssetDatabase.GetAssetPath(m_SelGameObj); if (string.IsNullOrEmpty(filePath)) { string scenePath = AssetDatabase.GetAssetOrScenePath(m_SelGameObj); if (!string.IsNullOrEmpty(scenePath)) { #if !UNITY_5_3 filePath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(m_SelGameObj); #endif if (string.IsNullOrEmpty(filePath)) { Debug.LogError("选中对象文件路径为空"); return; } } } List <Mesh> meshList = new List <Mesh>(); for (int i = 0; i < m_SelSkinMehes.Length; ++i) { var sklMesh = m_SelSkinMehes[i]; if (sklMesh != null) { Mesh mesh = null; MeshRenderer mR = sklMesh as MeshRenderer; if (mR != null) { MeshFilter mF = mR.GetComponent <MeshFilter>(); if (mF != null) { mesh = mF.sharedMesh; } } else { SkinnedMeshRenderer smR = sklMesh as SkinnedMeshRenderer; if (smR != null) { if (sel == 2) { mesh = new Mesh(); smR.BakeMesh(mesh); } else { mesh = smR.sharedMesh; } } } if (mesh != null) { meshList.Add(mesh); } //var mesh = new Mesh(); //sklMesh.BakeMesh(mesh); //meshList.Add(mesh); } } if (sel == 0) { filePath = Path.ChangeExtension(filePath, ".dae"); ExportCollada.Export(meshList, m_SelSkinMehes, filePath); } else if (sel == 1) { ExportCollada.ExportSklsToAsset(m_SelSkinMehes, filePath); } else if (sel == 2) { string fileName = Path.GetFileNameWithoutExtension(filePath); filePath = string.Format("{0}/{1}_bakedMesh.dae", Path.GetDirectoryName(filePath), fileName); ExportCollada.Export(meshList, m_SelSkinMehes, filePath); if (meshList != null) { for (int i = 0; i < meshList.Count; ++i) { var mesh = meshList[i]; if (mesh != null) { GameObject.DestroyImmediate(mesh); } } meshList.Clear(); } } else if (sel == 3) { // 合并动画到贴图 filePath = Path.GetDirectoryName(filePath); ExportCollada.ExportAnimToTex(meshList, m_SelSkinMehes, m_SelClip, filePath); } // ExportCollada.ExportToScene(meshList, m_SelSkinMehes); AssetDatabase.Refresh(); #endif }