示例#1
0
    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();
    }
示例#2
0
    /// <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();
        }
    }