Unity3D教程:储存模型网格资料

发表于2017-03-23
评论0 925浏览
  本篇文章要给大家分享的是Unity3D中储存模型网格资料的方法,在此过程中主要会用到一下这三个技巧:制作外挂面板、合并网格、储存资料,一起来看看吧。

  一开始先开启一个新专案
  并汇入一个含有 Skinned Mesh Renderer 的任意模型来当作提取范本
  将汇入的模型拖拉至场景中
  接著建立一个 SaveSkinMeshWizard.cs 脚本


  开启 SaveSkinMeshWizard.cs 脚本进行脚本撰写
  首先利用 ScriptableWizard 来产生外挂面板
1
2
3
4
5
6
7
8
9
10
11
12
13
using UnityEngine;
using UnityEditor;
 
public class SaveSkinMeshWizard : ScriptableWizard
{
    //This line make the method to show in the Toolbar/SaveMesh/Open Save Mesh From SkinMeshRenderer
    [MenuItem("SaveMesh/Open Save Mesh From SkinMeshRenderer")]
    //Create the panel
    private static void CreateWizard()
    {  
        ScriptableWizard.DisplayWizard( "Save Mesh From MeshFilter" ); 
    }
}
  到这边可以发现在面板中出现自定义的选项


可以发现到目前面板开启后没有任何输入参数
所以在这边我们加入一个 GameObject 参数
为面板新增一个複製物件选项

//Put the object which you want to clone it's mesh
public GameObject cloneObject;


到目前为止若点选面板上的 Create 按钮会出现以下讯息
所以我们需要在脚本中建立 OnWizardCreate 方法改善这个问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//If we click the create button in the panel, this method will be executed.
private void OnWizardCreate()
{
    //User can choose the path of the mesh file
    string path = EditorUtility.SaveFilePanelInProject( "Save Mesh From MeshFilter", cloneObject.name + "_Mesh", "asset", "Specify where to save the mesh." );
         
    //If user choose one path
    if( path.Length > 0 )
    {
             
        //Get all meshes in the SkinnedMeshRenderer
        SkinnedMeshRenderer[] skinnedMeshRenderers = cloneObject.GetComponentsInChildren();
        CombineInstance[] combine = new CombineInstance[skinnedMeshRenderers.Length];
             
        //Combine all meshed in one mesh
        for( int cnt = 0; cnt < skinnedMeshRenderers.Length; cnt++ )
        {
                 
            combine[cnt].mesh = skinnedMeshRenderers[cnt].sharedMesh;
            combine[cnt].transform = skinnedMeshRenderers[cnt].transform.localToWorldMatrix;
                 
        }
             
        //Create the new mesh
        Mesh mesh = new Mesh();
        mesh.CombineMeshes( combine );
             
        //Optimize the mesh
        MeshUtility.Optimize( mesh );
             
        //Create the mesh file
        AssetDatabase.CreateAsset( mesh, path );
             
    }  
}

完成后再次开启面板并拖拉模型至 Clone Ocject 参数上
选择储存路径后
按下存档
就可以完成模型网格资料储存的动作


最后附上完整程式码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using UnityEngine;
using UnityEditor;
 
public class SaveSkinMeshWizard : ScriptableWizard
{
    //This line make the method to show in the Toolbar/SaveMesh/Open Save Mesh From SkinMeshRenderer
    [MenuItem("SaveMesh/Open Save Mesh From SkinMeshRenderer")]
    //Create the panel
    private static void CreateWizard()
    {  
        ScriptableWizard.DisplayWizard( "Save Mesh From MeshFilter" ); 
    }
 
    //Put the object which you want to clone it's mesh
    public GameObject cloneObject;
 
    //If we click the create button in the panel, this method will be executed.
    private void OnWizardCreate()
    {
        //User can choose the path of the mesh file
        string path = EditorUtility.SaveFilePanelInProject( "Save Mesh From MeshFilter", cloneObject.name + "_Mesh", "asset", "Specify where to save the mesh." );
             
        //If user choose one path
        if( path.Length > 0 )
        {
                 
            //Get all meshes in the SkinnedMeshRenderer
            SkinnedMeshRenderer[] skinnedMeshRenderers = cloneObject.GetComponentsInChildren();
            CombineInstance[] combine = new CombineInstance[skinnedMeshRenderers.Length];
                 
            //Combine all meshed in one mesh
            for( int cnt = 0; cnt < skinnedMeshRenderers.Length; cnt++ )
            {
                     
                combine[cnt].mesh = skinnedMeshRenderers[cnt].sharedMesh;
                combine[cnt].transform = skinnedMeshRenderers[cnt].transform.localToWorldMatrix;
                     
            }
                 
            //Create the new mesh
            Mesh mesh = new Mesh();
            mesh.CombineMeshes( combine );
                 
            //Optimize the mesh
            MeshUtility.Optimize( mesh );
                 
            //Create the mesh file
            AssetDatabase.CreateAsset( mesh, path );
                 
        }  
    }
}

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论