Fbx.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. using System.IO;
  6. using System.Text.RegularExpressions;
  7. public class ExportTool : EditorWindow
  8. {
  9. //"ExpFbx"
  10. const string ExpFolderName = "/Res/Mesh";
  11. const string MaterialPath = "Assets/Res/Materials/";
  12. const string MeshPath = "Assets/Res/Mesh/";
  13. static List<string> fileList;
  14. [MenuItem("Model/导出Fbx")]
  15. public static void ExportUnique()
  16. {
  17. Transform[] selectedObjs = Selection.transforms;
  18. GetFileList();
  19. foreach (Transform trans in selectedObjs)
  20. {
  21. ExportFbx(trans);
  22. }
  23. }
  24. public static void GetFileList()
  25. {
  26. fileList = new List<string>();
  27. var path = Application.dataPath + ExpFolderName;
  28. if (!Directory.Exists(path))
  29. {
  30. Directory.CreateDirectory(path);
  31. }
  32. var fileArr = Directory.GetFiles(path, "*.fbx");
  33. foreach (var fpath in fileArr)
  34. {
  35. var name = Path.GetFileNameWithoutExtension(fpath);
  36. fileList.Add(name);
  37. }
  38. }
  39. public static string ParseName(string name)
  40. {
  41. return Regex.Replace(name, @"([\s\S]+)\s\(?\d+\)?", "$1").Trim();
  42. }
  43. public static void ExportFbx(Transform trans)
  44. {
  45. //FBXExporter导不出SkinnedMeshRenderer
  46. if (trans.GetComponent<MeshFilter>())
  47. {
  48. var mesh = trans.GetComponent<MeshFilter>();
  49. var name = mesh.sharedMesh.name;
  50. name = ParseName(name);
  51. if (!fileList.Contains(name))
  52. {
  53. fileList.Add(name);
  54. FBXExporter.ExportFBX(ExpFolderName, name, new GameObject[] { trans.gameObject }, true);
  55. }
  56. }
  57. for (int i = 0; i < trans.childCount; i++)
  58. {
  59. ExportFbx(trans.GetChild(i));
  60. }
  61. }
  62. [MenuItem("Model/创建Obj")]
  63. public static void CreateObj()
  64. {
  65. Transform[] selectedObjs = Selection.transforms;
  66. foreach (Transform trans in selectedObjs)
  67. {
  68. CreateObject(null, trans);
  69. }
  70. }
  71. static void CreateObject(Transform parent, Transform target)
  72. {
  73. GameObject obj = null;
  74. obj = new GameObject();
  75. if (target.GetComponent<MeshFilter>() && target.GetComponent<MeshRenderer>())
  76. {
  77. var targMesh = target.GetComponent<MeshFilter>();
  78. var targMat = target.GetComponent<MeshRenderer>().sharedMaterial;
  79. var targMeshName = ParseName(targMesh.sharedMesh.name);
  80. var targMatName = targMat.name;
  81. var mesh = AssetDatabase.LoadAssetAtPath(MeshPath + targMeshName + ".fbx", typeof(Mesh)) as Mesh;
  82. if (targMeshName != mesh.name)
  83. {
  84. Debug.Log("Warning!!!" + targMeshName + "!=" + mesh.name);
  85. }
  86. if (mesh != null)
  87. {
  88. var meshFilter = obj.AddComponent<MeshFilter>();
  89. meshFilter.sharedMesh = mesh;
  90. }
  91. else
  92. {
  93. Debug.Log("LoseMesh[" + targMeshName + "]");
  94. }
  95. var mat = AssetDatabase.LoadAssetAtPath(MaterialPath + targMatName + ".mat", typeof(Material)) as Material;
  96. if (mat != null)
  97. {
  98. var meshRender = obj.AddComponent<MeshRenderer>();
  99. meshRender.sharedMaterial = mat;
  100. }
  101. else
  102. {
  103. Debug.Log("LoseMaterial[" + targMatName + "]");
  104. }
  105. }
  106. else if (target.GetComponent<SkinnedMeshRenderer>())
  107. {
  108. Debug.Log("LoseSkinnedMeshRenderer[" + target.name + "]");
  109. }
  110. var objName = ParseName(target.gameObject.name);
  111. obj.name = objName;
  112. obj.transform.parent = parent;
  113. obj.transform.position = target.position;
  114. obj.transform.rotation = target.rotation;
  115. obj.transform.localScale = target.localScale;
  116. for (int i = 0; i < target.childCount; i++)
  117. {
  118. CreateObject(obj.transform, target.GetChild(i));
  119. }
  120. }
  121. }