using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using System.Text.RegularExpressions; public class ExportTool : EditorWindow { //"ExpFbx" const string ExpFolderName = "/Res/Mesh"; const string MaterialPath = "Assets/Res/Materials/"; const string MeshPath = "Assets/Res/Mesh/"; static List fileList; [MenuItem("Model/导出Fbx")] public static void ExportUnique() { Transform[] selectedObjs = Selection.transforms; GetFileList(); foreach (Transform trans in selectedObjs) { ExportFbx(trans); } } public static void GetFileList() { fileList = new List(); var path = Application.dataPath + ExpFolderName; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var fileArr = Directory.GetFiles(path, "*.fbx"); foreach (var fpath in fileArr) { var name = Path.GetFileNameWithoutExtension(fpath); fileList.Add(name); } } public static string ParseName(string name) { return Regex.Replace(name, @"([\s\S]+)\s\(?\d+\)?", "$1").Trim(); } public static void ExportFbx(Transform trans) { //FBXExporter导不出SkinnedMeshRenderer if (trans.GetComponent()) { var mesh = trans.GetComponent(); var name = mesh.sharedMesh.name; name = ParseName(name); if (!fileList.Contains(name)) { fileList.Add(name); FBXExporter.ExportFBX(ExpFolderName, name, new GameObject[] { trans.gameObject }, true); } } for (int i = 0; i < trans.childCount; i++) { ExportFbx(trans.GetChild(i)); } } [MenuItem("Model/创建Obj")] public static void CreateObj() { Transform[] selectedObjs = Selection.transforms; foreach (Transform trans in selectedObjs) { CreateObject(null, trans); } } static void CreateObject(Transform parent, Transform target) { GameObject obj = null; obj = new GameObject(); if (target.GetComponent() && target.GetComponent()) { var targMesh = target.GetComponent(); var targMat = target.GetComponent().sharedMaterial; var targMeshName = ParseName(targMesh.sharedMesh.name); var targMatName = targMat.name; var mesh = AssetDatabase.LoadAssetAtPath(MeshPath + targMeshName + ".fbx", typeof(Mesh)) as Mesh; if (targMeshName != mesh.name) { Debug.Log("Warning!!!" + targMeshName + "!=" + mesh.name); } if (mesh != null) { var meshFilter = obj.AddComponent(); meshFilter.sharedMesh = mesh; } else { Debug.Log("LoseMesh[" + targMeshName + "]"); } var mat = AssetDatabase.LoadAssetAtPath(MaterialPath + targMatName + ".mat", typeof(Material)) as Material; if (mat != null) { var meshRender = obj.AddComponent(); meshRender.sharedMaterial = mat; } else { Debug.Log("LoseMaterial[" + targMatName + "]"); } } else if (target.GetComponent()) { Debug.Log("LoseSkinnedMeshRenderer[" + target.name + "]"); } var objName = ParseName(target.gameObject.name); obj.name = objName; obj.transform.parent = parent; obj.transform.position = target.position; obj.transform.rotation = target.rotation; obj.transform.localScale = target.localScale; for (int i = 0; i < target.childCount; i++) { CreateObject(obj.transform, target.GetChild(i)); } } }