Unity3D教程:储存模型网格资料
发表于2017-03-23
本篇文章要给大家分享的是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 ); } } } |