shaoxiadiablo/Assets/AGame/Editor/ModelPostProcessor.cs

433 lines
13 KiB
C#
Raw Normal View History

2025-05-18 01:04:31 +08:00
//// ***********************************************************************
//// Assembly : Unity
//// Author : Kimch
//// Created : 2018-04-27
////
//// Last Modified By : Kimch
//// Last Modified On :
//// ***********************************************************************
//// <copyright file= "ModelPostProcessor" company="ddl"></copyright>
//// <summary></summary>
//// ***********************************************************************
//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<GameObject>(assetPath);
// var instancePrefab = GameObject.Instantiate(prefab);
// instancePrefab.name = prefab.name;
// var gameObjects = instancePrefab.GetComponentsInChildren<Transform>();
// 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<GameObject>(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<GameObject>(assetPath);
// var instanceRoot = GameObject.Instantiate<GameObject>(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<GameObject>(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<string> 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<string> boneSet = new HashSet<string>();
// 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;
// }
// /// <summary>
// /// 创建人物骨架
// /// </summary>
// /// <param name="prefab"></param>
// private void CreateBone(GameObject prefab)
// {
// var path = AVATAR_PREFAB_PATH + prefab.name + ".prefab";
// SavePrefab(prefab, path);
// }
// /// <summary>
// /// 拆分avatar
// /// </summary>
// /// <param name="prefab"></param>
// 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);
// }
// }
// }
// /// <summary>
// /// child
// /// </summary>
// /// <param name="prefab"></param>
// /// <param name="name"></param>
// 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<Transform>();
// var smrs = new List<SkinnedMeshRenderer>();
// 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<Transform>();
// 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<SkinnedMeshRenderer>();
// if (skinRender == null)
// continue;
// var matNames = matConfig.GetFacePartMats(groupID, childT.name);
// if (null == matNames)
// continue;
// List<Material> matList = new List<Material>();
// foreach (var matName in matNames)
// {
// var mat = AssetDatabase.LoadAssetAtPath<Material>(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);
// }
//}