433 lines
13 KiB
C#
433 lines
13 KiB
C#
//// ***********************************************************************
|
|
//// 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);
|
|
// }
|
|
//} |