public override void OnInspectorGUI() { base.OnInspectorGUI(); GUILayout.Space(8); m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition); CharacterPartition partition = target as CharacterPartition; partition.m_FBXSource = EditorGUILayout.ObjectField("FBX Source", partition.m_FBXSource, typeof(GameObject), false) as GameObject; if (partition.m_FBXSource != null) { if (m_FbxInstance == null || m_FbxInstance.name != partition.m_FBXSource.name) { if (m_FbxInstance != null) { DestroyImmediate(m_FbxInstance); partition.ClearMeshMaterialInfos(); } m_FbxInstance = GameObject.Instantiate(partition.m_FBXSource) as GameObject; m_FbxInstance.name = partition.m_FBXSource.name; } SkinnedMeshRenderer[] skinnedMeshes = m_FbxInstance.GetComponentsInChildren <SkinnedMeshRenderer>(); foreach (SkinnedMeshRenderer mesh in skinnedMeshes) { NGUIEditorTools.BeginContents(); { if (NGUIEditorTools.DrawHeader(string.Format("{0} Material Settings", mesh.name))) { if (!partition.IsMeshMaterialOverride(mesh.name)) { partition.RegisterMesh(mesh.name, mesh.sharedMaterials); } CharacterPartition.MeshMaterialInfo meshMatInfo = partition.GetMeshMaterialInfo(mesh.name); if (string.IsNullOrEmpty(meshMatInfo.MeshName)) { meshMatInfo.MeshName = mesh.name; } meshMatInfo.MaterialCount = EditorGUILayout.IntField("Material Count", meshMatInfo.MaterialCount); if (meshMatInfo.MaterialCount == 0) { meshMatInfo.Materials = null; } else { if (meshMatInfo.Materials == null) { meshMatInfo.Materials = new Material[meshMatInfo.MaterialCount]; } else { if (meshMatInfo.Materials.Length != meshMatInfo.MaterialCount) { Material[] materials = new Material[meshMatInfo.MaterialCount]; for (int i = 0; i < meshMatInfo.MaterialCount; i++) { if (i < meshMatInfo.Materials.Length) { materials[i] = meshMatInfo.Materials[i]; } else { materials[i] = null; } } meshMatInfo.Materials = materials; } } //bool needUpdate = false; for (int i = 0; i < meshMatInfo.MaterialCount; i++) { //Material prevMat = meshMatInfo.Materials[i]; meshMatInfo.Materials[i] = EditorGUILayout.ObjectField(meshMatInfo.Materials[i], typeof(Material), false) as Material; //if(prevMat != meshMatInfo.Materials[i]) //{ //needUpdate = true; //} } ///if(needUpdate) //{ if (m_FbxInstance != null) { bool needMaterialUpdate = false; if (mesh.sharedMaterials != null) { if (meshMatInfo.Materials == null) { needMaterialUpdate = true; } else { if (mesh.sharedMaterials.Length != meshMatInfo.Materials.Length) { needMaterialUpdate = true; } else { for (int i = 0; i < mesh.sharedMaterials.Length; i++) { if (mesh.sharedMaterials[i] != meshMatInfo.Materials[i]) { needMaterialUpdate = true; break; } } } } } else { if (meshMatInfo.Materials != null) { needMaterialUpdate = true; } } if (needMaterialUpdate) { mesh.sharedMaterials = meshMatInfo.Materials; } } //} } partition.RegisterMesh(meshMatInfo.MeshName, meshMatInfo.Materials); } } NGUIEditorTools.EndContents(); } } else { if (m_FbxInstance != null) { DestroyImmediate(m_FbxInstance); m_FbxInstance = null; partition.ClearMeshMaterialInfos(); } } GUILayout.EndScrollView(); }
/// <summary> /// 更新部件 /// </summary> /// <param name="name">部件名称</param> /// <param name="assetName">资源名称</param> /// <param name="partitionObj">部件数据对象</param> /// <param name="isLinkObj">是否有部件信息组件</param> void UpdatePartition(string name, string assetName, GameObject partitionObj, bool isLinkObj = false) { if (!m_Partitions.ContainsKey(name)) { EB.Debug.LogError(string.Format("更新部件,发现这个部件不存在部件列表当中,: {0} ,部件的资源名称: {1}!", name, assetName)); } PartitionObject partition = m_Partitions[name]; if (partition == null) { return; } if (!isLinkObj) //现在默认都是没有部件列表的组件了,每次都进去 { partition.ClearMeshObjects(); } //initialize character partition: load skinnedmeshes and set materials CharacterPartition characterPartition = partitionObj.GetComponent <CharacterPartition>(); if (characterPartition != null) { characterPartition.Initialize(); } ColorCustomization customization = partitionObj.GetComponent <ColorCustomization>(); if (customization != null) { customization.ApplyColor(); } bool isChildrenPatition = IsChildrenPartition(name, assetName); //日志 EB.Debug.LogObjectMgrAsset("<color=#00ff00>更新合并部件的骨骼:{0}</color>,,assetName:<color=#00ff00>{1}</color>是否为这个角色的子级:<color=#00ff00>{2}</color>,isLinkObj:<color=#00ff00>{3}</color>" , name, assetName, isChildrenPatition, isLinkObj); // if (isChildrenPatition) { //更新部件,先注掉,因为业务逻辑已经过老了 UpdateChildrenPartition(partition, name, assetName, partitionObj); } else { try { UpdateCombineBonePartition(partition, name, assetName, partitionObj, isLinkObj); } catch (System.NullReferenceException e) { EB.Debug.LogError(e.ToString()); } partition.UnregisterObject(partitionObj); } if (SyncLoad && m_ToLoad.Count == 0) { var iter = m_Partitions.GetEnumerator(); while (iter.MoveNext()) { iter.Current.Value.ShowMeshObjects(); } iter.Dispose(); } CharacterColorScale colorScale = GetComponent <CharacterColorScale>(); if (colorScale != null) { colorScale.ForceUpdateColorScale(); } }