void OnGUI() { GUILayout.Label("--- Target PlayerModel ---"); GameObject newModel = (GameObject)EditorGUILayout.ObjectField("PlayerModel", playerModel, typeof(GameObject), true); if (newModel != playerModel) { #region a var modelClone = Object.Instantiate(newModel) as GameObject; bool hasWeaponAttachment = modelClone.transform.RecursiveObjectExist(ConstDefineManager.LBWeaponPos) || modelClone.transform.RecursiveObjectExist(ConstDefineManager.RBWeaponPos) || modelClone.transform.RecursiveObjectExist(ConstDefineManager.LHWeaponPos) || modelClone.transform.RecursiveObjectExist(ConstDefineManager.RHWeaponPos); if (!hasWeaponAttachment) { if (EditorUtility.DisplayDialog("提示!", "模型没有武器挂载点", "ok", "cancel")) { playerModel = newModel; } } else { playerModel = newModel; } Object.DestroyImmediate(modelClone); #endregion } EditorGUILayout.Separator(); if (GUILayout.Button("0-测试AssetBundle")) { _database = SkinMeshRenderHolder.CreateInstance <SkinMeshRenderHolder>(); _database.name = "First"; SetData(); } if (GUILayout.Button("1-创建材质")) { if (newModel != null) { if (JianghuPlayerAssetManager_V2.GenerateMaterials(playerModel, out errorInfo)) { EditorUtility.DisplayDialog("Character Generator", "创建材质成功", "ok", "cancel"); } else { EditorUtility.DisplayDialog("Character Generator", "创建材质失败", "ok", "cancel"); } } else { } } if (GUILayout.Button("2-分解动画")) { if (newModel != null) { if (JianghuPlayerAssetManager_V2.SplitAnimations(playerModel, out errorInfo)) { EditorUtility.DisplayDialog("Character Generator", "分解动画成功", "ok", "cancel"); } else { EditorUtility.DisplayDialog("Character Generator", "分解动画失败", "ok", "cancel"); } } else { } } if (GUILayout.Button("3-生成角色基础预设件")) { if (newModel != null) { if (JianghuPlayerAssetManager_V2.GenerateRoleBaseAsset(playerModel, out errorInfo)) { EditorUtility.DisplayDialog("Character Generator", "生成角色基础预设件成功", "ok", "cancel"); } else { EditorUtility.DisplayDialog("Character Generator", "生成角色基础预设件失败", "ok", "cancel"); } } else { } } //生成蒙皮物件 if (GUILayout.Button("4-生成蒙皮物件")) { if (newModel != null) { if (JianghuPlayerAssetManager_V2.GenerateRoleSkinAsset(playerModel, out errorInfo)) { EditorUtility.DisplayDialog("Character Generator", "生成蒙皮物件成功", "ok", "cancel"); } else { EditorUtility.DisplayDialog("Character Generator", "生成蒙皮物件失败", "ok", "cancel"); } } else { } } EditorGUILayout.Separator(); EditorGUILayout.Separator(); //生成一个角色 if (GUILayout.Button("生成一个角色")) { RoleGenerate.GenerateRole("char01", "Char01_001", false, MESHDENSITY.HIGHT); } if (GUILayout.Button("生成一个角色(低模)")) { RoleGenerate.GenerateRole("Char01", "Char01_001", false, MESHDENSITY.LOW); } GUILayout.BeginHorizontal(); GUILayout.EndHorizontal(); GUILayout.Label(errorInfo); }
/// <summary> /// 生成角色蒙皮预设件 /// </summary> /// <param name="targetModel"></param> /// <param name="errorInfo"></param> /// <returns></returns> public static bool GenerateRoleSkinAsset(GameObject targetModel, out string errorInfo) { if (!CheckModelValid(targetModel, out errorInfo)) { return(false); } var modelName = targetModel.name.Replace(M_MODELPREFIX, ""); string roleSkinPath = SKINEDMESH_PATH + modelName + "/"; if (!Directory.Exists(roleSkinPath)) { Directory.CreateDirectory(roleSkinPath); } DeleteSpecFiles(roleSkinPath); List <Material> materials = EditorHelpers.CollectAll <Material>(MATERIALS_PATH + modelName); foreach (var smr in targetModel.GetComponentsInChildren <SkinnedMeshRenderer>(true)) { SkinMeshRenderHolder smrHolder = ScriptableObject.CreateInstance <SkinMeshRenderHolder>(); smrHolder.Mats = new List <Material>(); smrHolder.Bones = new List <string>(); GameObject rendererClone = (GameObject)PrefabUtility.InstantiatePrefab(smr.gameObject); GameObject rendererParent = rendererClone.transform.parent.gameObject; rendererClone.transform.parent = null; Object.DestroyImmediate(rendererParent); Object rendererPrefab = GetPrefab(rendererClone, roleSkinPath + smr.name + "_smr.prefab"); smrHolder.SMRGO = rendererPrefab; foreach (Material m in materials) { string smrTemp; Debug.Log("smr.name = " + smr.name); if (smr.name.Contains("Low")) { smrTemp = smr.name.Substring(0, smr.name.LastIndexOf("_")); } else { smrTemp = smr.name; } //string smrTemp = smr.name.Substring(0, smr.name.LastIndexOf("_")); //smrTemp = smr.name.Substring(0, "Char01_001_low".LastIndexOf("_")); //Debug.Log("smrTemp = " + smrTemp); //Debug.Log("m = " + m.name); if (m.name.Contains(smrTemp.ToLower())) { smrHolder.Mats.Add(m); } //if (m.name.Contains(smr.name.ToLower())) smrHolder.Mats.Add(m); } //Debug.Log("smrHolder.mats = " + smrHolder.Mats.Count); //List<string> boneNames = new List<string>(); //字符串列表,记录子蒙皮模型对应的骨骼名称清单。 foreach (Transform t in smr.bones) { smrHolder.Bones.Add(t.name); } AssetDatabase.CreateAsset(smrHolder, roleSkinPath + smr.name + ".asset"); } return(true); }