Example #1
0
    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");
                    }
                }
            }
        }
    }
Example #2
0
        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
    }
Example #4
0
    // 合并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
    }