//// *********************************************************************** //// Assembly : Unity //// Author : Kimch //// Created : 2018-04-27 //// //// Last Modified By : Kimch //// Last Modified On : //// *********************************************************************** //// //// //// *********************************************************************** //using System.Collections.Generic; //using System.Text.RegularExpressions; //using UnityEditor; //using UnityEngine; //using System.IO; //public class ModelPostProcessor : AssetPostprocessor //{ // private const string AVATAR_PREFAB_PATH = "Assets/Ryff/Arts/Models/Avatar"; // private const string MODEL_PREFAB_PATH = "Assets/Ryff/Arts/Models"; // private const string AVATAR_ROOT_BONE = "Bip"; // private const string AVATAR_ROOT_MODEL = "Model"; // private const string AVATAR_PHY_PREFIX = "PHY"; // private const string AVARTAR_DYNAMIC_BONE_PREFIX = "config"; // private const string AVATAR_FACE_PREFIX = "face"; // private const string AVATAR_GAMERES_PATH = "Assets/Ryff/Resources/Prefabs/Role/"; // private const string AVATAR_ROOT_POINT = "point"; // private const string OBJECT_GAMERES_PATH = "Assets/Ryff/Resources/Prefabs/"; // private enum ResType // { // kGirl = 1, // kGirlAvatar = 2, // kMale = 3, // kMaleAvatar = 3, // } // private ResType CheckRes() // { // if (assetPath.Contains("Avatar")) // { // var modelName = System.IO.Path.GetFileNameWithoutExtension(assetPath); // if (modelName == "girl") // { // return ResType.kGirl; // } // var rFbx = new Regex(@"^girl_\d{4}$"); // //var rPHY = new Regex(@"^girl_\d{4}_PHY$"); // if (rFbx.IsMatch(modelName)) // { // return ResType.kGirlAvatar; // } // } // return 0; // } // //临时生成一套骨骼 // [MenuItem("Game/CreateBone")] // public static void CreatePrefabBone() // { // var strs = Selection.assetGUIDs; // var assetPath = AssetDatabase.GUIDToAssetPath(strs[0]); // if (assetPath.Contains(AVATAR_PREFAB_PATH)) // { // var prefab = AssetDatabase.LoadAssetAtPath(assetPath); // var instancePrefab = GameObject.Instantiate(prefab); // instancePrefab.name = prefab.name; // var gameObjects = instancePrefab.GetComponentsInChildren(); // for (int i = 0; i < gameObjects.Length; i++) // { // var childT = gameObjects[i]; // if (childT && !childT.name.StartsWith(AVATAR_ROOT_BONE) && childT.name != instancePrefab.name && !childT.name.EndsWith("point")) // { // childT.parent = null; // GameObject.DestroyImmediate(childT.gameObject); // } // } // var names = prefab.name.Split('_'); // var name = string.Format("{0}_{1}", names[0], names[1]); // var path = string.Format("{0}{1}.prefab", AVATAR_GAMERES_PATH, name); // PrefabUtility.SaveAsPrefabAsset(instancePrefab,path); // GameObject.DestroyImmediate(instancePrefab); // } // } // private void OnPreprocessModel() // { // //avatars 拆分 // if (assetPath.Contains(AVATAR_PREFAB_PATH)) // { // var modelImporter = assetImporter as ModelImporter; // modelImporter.importMaterials = true; // modelImporter.materialName = ModelImporterMaterialName.BasedOnMaterialName; // modelImporter.materialLocation = ModelImporterMaterialLocation.External; // modelImporter.materialSearch = ModelImporterMaterialSearch.Everywhere; // var prefab = AssetDatabase.LoadAssetAtPath(assetPath); // CheckModel(prefab); // if (prefab) // { // CreateDynamicBoneConfig(); // CreateAvatars(prefab); // ClearDynamicBoneConfig(); // } // } // //创建非avater prefab // if (assetPath.Contains(MODEL_PREFAB_PATH) && !assetPath.Contains(AVATAR_PREFAB_PATH)) // { // if (assetPath.Contains("@")) // { // Debug.Log("非生成prefab的Fbx,不进行生成prefab处理"); // return; // } // //设置fbx 材质导出 // var modelImport = assetImporter as ModelImporter; // if (modelImport.optimizeGameObjects == false) // { // modelImport.optimizeGameObjects = true; // } // if (modelImport.materialLocation != ModelImporterMaterialLocation.External) // { // modelImport.materialName = ModelImporterMaterialName.BasedOnMaterialName; // modelImport.materialLocation = ModelImporterMaterialLocation.External; // modelImport.materialSearch = ModelImporterMaterialSearch.Everywhere; // AssetDatabase.ImportAsset(modelImport.assetPath); // return; // } // //创建prefab // var prefab = AssetDatabase.LoadAssetAtPath(assetPath); // var instanceRoot = GameObject.Instantiate(prefab); // var folderPath = Path.GetDirectoryName(assetPath); // //保存prefab // PrefabUtility.SaveAsPrefabAsset(instanceRoot, string.Format("{0}{1}/{2}.prefab", OBJECT_GAMERES_PATH, GetModelDirName(assetPath), prefab.name)); // GameObject.DestroyImmediate(instanceRoot); // } // } // string GetModelDirName(string assetPath) // { // string path = assetPath.Replace(@"\\", "/"); // string tempStr = assetPath.Replace($"{MODEL_PREFAB_PATH}/", ""); // string[] vs = tempStr.Split('/'); // string DirName = vs[0]; // if (DirName == "Weapon") // { // DirName = "Equips"; // } // return DirName; // } // DynamicBoneConfigData dynamicBoneConfig = null; // void CreateDynamicBoneConfig() // { // //var configName = assetPath.Replace(".FBX",".prefab"); // var configName = Regex.Replace(assetPath, ".FBX", ".prefab", System.Text.RegularExpressions.RegexOptions.IgnoreCase); // GameObject dynamicBonePrefab = AssetDatabase.LoadAssetAtPath(configName); // if (dynamicBonePrefab) // { // dynamicBoneConfig = DynamicBoneConfigMenu.CreateDynamicBoneConfig(dynamicBonePrefab.transform); // } // } // void ApplyDynamicBoneConfig(GameObject prefab, string name) // { // if (dynamicBoneConfig) // { // prefab.name = name; // dynamicBoneConfig.Apply(prefab); // } // } // void ClearDynamicBoneConfig() // { // dynamicBoneConfig = null; // } // string GetSubPartRegExp(string NO) // { // List list = ModelNameSet.Instance.subPartAndDecorateNames; // string res = string.Format(@"({0})", string.Join(@")|(", list.ToArray())); // res = string.Format(@"^(({0})_{1})|{2}$", res, NO, ModelNameSet.RootBoneName); // return res; // } // string GetPrefabNO(GameObject prefab) // { // string NO = ""; // if (prefab != null) // { // Regex rName = new Regex(@"(?<=_)\d{4}$"); // NO = rName.Match(prefab.name).Value; // } // return NO; // } // bool CheckModel(GameObject prefab) // { // if (prefab == null) // { // return false; // } // bool res = true; // string NO = GetPrefabNO(prefab); // string subPartRegExp = GetSubPartRegExp(NO); // Regex subPartReg = new Regex(subPartRegExp); // Regex subPartPreNameReg = new Regex(@"^[a-z]+(?=_)"); // var prefabT = prefab.transform; // for (int i = 0; i < prefabT.childCount; ++i) // { // var childT = prefabT.GetChild(i); // if (!subPartReg.IsMatch(childT.name)) // { // Debug.LogError("Model " + prefab.name + "-> sub-part name " + childT.name + " is illegal"); // } // if (childT.name == ModelNameSet.RootBoneName) // { // CheckBone(childT); // } // else // { // if (!CheckTransZero(childT)) // { // Debug.LogError("Mode " + prefab.name + "->cloth " + childT.name + " transform pos is not zero"); // res = false; // } // for (int j = 0; j < childT.childCount; ++j) // { // var clothPart = childT.GetChild(j); // var bodyName = subPartPreNameReg.Match(childT.name).Value; // //CheckSubPart(clothPart, bodyName, prefab.name); // if (!CheckTransZero(clothPart)) // { // Debug.LogError("Mode " + prefab.name + "->cloth " + clothPart.parent.name + "->sub-part " + clothPart.name + " transform pos is not zero"); // res = false; // } // } // } // } // return res; // } // bool CheckSubPart(Transform clothPart, string partName, string modelName) // { // bool res = true; // if (!ModelEditorConfig.Instance.CheckSubPartName(partName, clothPart.name)) // { // Debug.LogError("Mode " + modelName + ":cloth " + clothPart.parent.name + ": sub-part name " + clothPart.name + " illegal"); // res = false; // } // return res; // } // bool CheckTransZero(Transform clothPart) // { // return clothPart.localPosition == Vector3.zero; // } // bool CheckBone(Transform rootBone) // { // bool res = true; // var bones = rootBone.GetComponentsInChildren(typeof(Transform), true); // HashSet boneSet = new HashSet(); // for (int i = 0; i < bones.Length; ++i) // { // if (!boneSet.Add(bones[i].name)) // { // Debug.LogError("The model " + rootBone.parent.name + " has illegal bone name: " + bones[i].name + " (it is already exist!)"); // res = false; // } // } // return res; // } // /// // /// 创建人物骨架 // /// // /// // private void CreateBone(GameObject prefab) // { // var path = AVATAR_PREFAB_PATH + prefab.name + ".prefab"; // SavePrefab(prefab, path); // } // /// // /// 拆分avatar // /// // /// // private void CreateAvatars(GameObject prefab) // { // var prefabT = prefab.transform; // for (int i = prefabT.childCount - 1; i >= 0; i--) // { // var childT = prefabT.GetChild(i); // var childName = childT.name; // if (!childName.StartsWith(AVATAR_ROOT_BONE)) // { // CreateAvatar(prefab, childName); // } // } // } // /// // /// child // /// // /// // /// // private void CreateAvatar(GameObject prefab, string name) // { // var go = Object.Instantiate(prefab); // Transform rootBone = null; // var goT = go.transform; // for (int i = goT.childCount - 1; i >= 0; i--) // { // var childT = goT.GetChild(i); // var childName = childT.name; // if (!childName.StartsWith(AVATAR_ROOT_BONE)) // { // if (childName != name) // { // childT.parent = null; // Object.DestroyImmediate(childT.gameObject); // } // else // { // //if (childT.name.StartsWith(AVATAR_FACE_PREFIX)) // //{ // // SetFaceMaterials(childT); // //} // childT.name = AVATAR_ROOT_MODEL; // } // } // else // { // rootBone = childT; // } // } // var validBones = new HashSet(); // var smrs = new List(); // go.GetComponentsInChildren(smrs); // if (smrs != null && smrs.Count > 0) // { // foreach (var smr in smrs) // { // validBones.Add(smr.rootBone); // foreach (var bone in smr.bones) // { // validBones.Add(bone); // } // } // } // var allBones = new List(); // rootBone.GetComponentsInChildren(allBones); // for (int i = allBones.Count - 1; i >= 0; i--) // { // var bone = allBones[i]; // if (!validBones.Contains(bone)) // { // if (bone.name.StartsWith(AVATAR_PHY_PREFIX)) // { // Object.DestroyImmediate(bone.gameObject); // } // } // } // ApplyDynamicBoneConfig(go,name); // var path = AVATAR_GAMERES_PATH + name + ".prefab"; // SavePrefab(go, path); // Object.DestroyImmediate(go); // } // void SetFaceMaterials(Transform faceT) // { // //Debug.Log("************ faceT="+faceT.name+","+ faceT.parent.name); // Regex rName = new Regex(@"^girl_\d{4}"); // Regex rNO = new Regex(@"(?<=girl_)\d{4}(?=\D)"); // var matConfig = ModelEditorConfig.Instance; // var name = rName.Match(faceT.parent.name).Value; // var no = rNO.Match(faceT.parent.name).Value; // int groupID = 0; // int.TryParse(no, out groupID); // var matPath = AVATAR_GAMERES_PATH + name + "/" + "Materials/"; // for (var i = 0; i < faceT.childCount; ++i) // { // var childT = faceT.GetChild(i); // var skinRender = childT.GetComponent(); // if (skinRender == null) // continue; // var matNames = matConfig.GetFacePartMats(groupID, childT.name); // if (null == matNames) // continue; // List matList = new List(); // foreach (var matName in matNames) // { // var mat = AssetDatabase.LoadAssetAtPath(matPath + matName + ".mat"); // if (mat != null) // { // //Debug.Log("************* path=" + matPath + matName); // matList.Add(mat); // } // else // { // Debug.LogError("Model " + faceT.parent.name + ": part " + faceT.name + " :" + " materail " + matName + " cannot load!"); // } // } // skinRender.materials = matList.ToArray(); // } // } // private void SavePrefab(GameObject go, string path) // { // bool success; // PrefabUtility.SaveAsPrefabAsset(go, path, out success); // } //}