public override void OnInspectorGUI()
    {
        RenderEffect   renderEffect   = target as RenderEffect;
        ParticleSystem particleSystem = renderEffect.gameObject.GetComponent <ParticleSystem>();

        EditorGUILayout.BeginVertical();


        if (particleSystem == null)
        {
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Open BillBoardOption");
            renderEffect.m_EnableBillBoard = EditorGUILayout.Toggle(renderEffect.m_EnableBillBoard);
            EditorGUILayout.EndHorizontal();

            if (renderEffect.m_EnableBillBoard)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("BillBoard Type");
                renderEffect.m_BillBoardType = (RenderBillBoardType)EditorGUILayout.EnumPopup(renderEffect.m_BillBoardType);
                EditorGUILayout.EndHorizontal();
                EditorGUI.indentLevel--;
            }
        }

        if (particleSystem == null)
        {
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Open Sort Layer Option");
            renderEffect.m_EnableSetSortLayer = EditorGUILayout.Toggle(renderEffect.m_EnableSetSortLayer);
            EditorGUILayout.EndHorizontal();
            if (renderEffect.m_EnableSetSortLayer)
            {
                EditorGUI.indentLevel++;
                EditorGUI.BeginChangeCheck();
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Sorting Layer");
                renderEffect.m_SortingLayerID = EditorGUILayout.IntPopup(renderEffect.m_SortingLayerID, m_LayerName, m_LayerID);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Sorting Order");
                renderEffect.m_SortingOrder = EditorGUILayout.IntField(renderEffect.m_SortingOrder);
                EditorGUILayout.EndHorizontal();

                if (EditorGUI.EndChangeCheck())
                {
                    renderEffect.UpdateRenderLayer();
                }
                EditorGUI.indentLevel--;
            }
        }
        Renderer render = renderEffect.gameObject.GetComponent <Renderer>();

        if (render != null)
        {
            if (GUILayout.Button("Refresh Material"))
            {
                renderEffect.RefreshMaterial();
            }
            EditorGUILayout.LabelField("Materials");
        }
        EditorGUI.indentLevel++;
        int index = 0;

        foreach (MaterialEffect matEffect in renderEffect.m_MaterialEffects)
        {
            string strIndex = "Element:" + index + "    ";
            if (matEffect.m_EffectMaterial == null)
            {
                GUILayout.Button(strIndex + "Material Not Assign");
                index++;
                continue;
            }
            else
            {
                if (GUILayout.Button(strIndex + matEffect.m_EffectMaterial.name))
                {
                    matEffect.m_EditorExtend = !matEffect.m_EditorExtend;
                }
                index++;
                if (matEffect.m_EditorExtend)
                {
                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.LabelField("Main Texture WrapMode");
                    matEffect.m_MainTexWrapMode = (TextureWrapMode)EditorGUILayout.EnumPopup(matEffect.m_MainTexWrapMode);
                    EditorGUILayout.EndHorizontal();

                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.LabelField("Cutoff Texture WrapMode");
                    matEffect.m_MaskTexWrapMode = (TextureWrapMode)EditorGUILayout.EnumPopup(matEffect.m_MaskTexWrapMode);
                    EditorGUILayout.EndHorizontal();
                }
            }
        }

        EditorGUI.indentLevel--;
        if (render != null && particleSystem == null)
        {
            EditorGUI.indentLevel++;
            EditorGUILayout.LabelField("Switch Render Type");
            if (render.GetType() != typeof(LineRenderer))
            {
                if (GUILayout.Button("Switch To Line Render"))
                {
                    LineRenderer lineRender = renderEffect.gameObject.AddComponent <LineRenderer>();
                    renderEffect.m_Render      = lineRender;
                    lineRender.sharedMaterials = render.sharedMaterials;
                    UnityEngine.Object.DestroyImmediate(render);
                    MeshFilter meshFilter = renderEffect.gameObject.GetComponent <MeshFilter>();
                    if (meshFilter != null)
                    {
                        UnityEngine.Object.DestroyImmediate(meshFilter);
                    }
                    Collider meshCollider = renderEffect.gameObject.GetComponent <Collider>();
                    if (meshCollider != null)
                    {
                        UnityEngine.Object.DestroyImmediate(meshCollider);
                    }
                    EditorGUIUtility.ExitGUI();
                }
            }
            if (render.GetType() != typeof(MeshRenderer))
            {
                if (GUILayout.Button("Switch To Mesh Render"))
                {
                    MeshRenderer lineRender = renderEffect.gameObject.AddComponent <MeshRenderer>();
                    lineRender.sharedMaterials = render.sharedMaterials;
                    renderEffect.m_Render      = lineRender;
                    UnityEngine.Object.DestroyImmediate(render);
                    MeshFilter meshFilter = renderEffect.gameObject.GetComponent <MeshFilter>();
                    if (meshFilter == null)
                    {
                        renderEffect.gameObject.AddComponent <MeshFilter>();
                    }
                    Collider Collider = renderEffect.gameObject.GetComponent <Collider>();
                    if (Collider != null)
                    {
                        UnityEngine.Object.DestroyImmediate(Collider);
                    }
                    MeshCollider meshCollider = renderEffect.gameObject.GetComponent <MeshCollider>();
                    if (meshCollider == null)
                    {
                        renderEffect.gameObject.AddComponent <MeshCollider>();
                    }
                    EditorGUIUtility.ExitGUI();
                }
            }
            if (render.GetType() != typeof(TrailRenderer))
            {
                if (GUILayout.Button("Switch To Trail Render"))
                {
                    TrailRenderer lineRender = renderEffect.gameObject.AddComponent <TrailRenderer>();
                    lineRender.sharedMaterials = render.sharedMaterials;
                    renderEffect.m_Render      = lineRender;
                    UnityEngine.Object.DestroyImmediate(render);
                    MeshFilter meshFilter = renderEffect.gameObject.GetComponent <MeshFilter>();
                    if (meshFilter != null)
                    {
                        UnityEngine.Object.DestroyImmediate(meshFilter);
                    }
                    Collider Collider = renderEffect.gameObject.GetComponent <Collider>();
                    if (Collider != null)
                    {
                        UnityEngine.Object.DestroyImmediate(Collider);
                    }
                    EditorGUIUtility.ExitGUI();
                }
            }
            if (render.GetType() == typeof(TrailRenderer))
            {
                if (GUILayout.Button("Clear Trail"))
                {
                    TrailRenderer trailRender = render.GetComponent <TrailRenderer> ();
                    trailRender.Clear();
                }
            }
            EditorGUI.indentLevel--;
        }


        EditorGUILayout.EndVertical();
    }
    public override void OnInspectorGUI()
    {
        bool bShowAll = false;
        bool bHideAll = false;

        EffectController effectCtrl = target as EffectController;

        EditorGUILayout.BeginVertical();

        EditorGUILayout.BeginHorizontal();
        EditorGUI.BeginDisabledGroup(effectCtrl.m_bLockNums);
        effectCtrl.m_nNumOfEffects = EditorGUILayout.IntField("Effect Count", effectCtrl.m_nNumOfEffects);
        EditorGUI.EndDisabledGroup();
        effectCtrl.m_bLockNums = EditorGUILayout.Toggle(effectCtrl.m_bLockNums);
        if (GUILayout.Button("One Click Expansion"))
        {
            bShowAll = true;
        }
        else
        {
            bShowAll = false;
        }

        if (GUILayout.Button("One Click Close"))
        {
            bHideAll = true;
        }
        else
        {
            bHideAll = false;
        }

        EditorGUILayout.EndHorizontal();

        int nCnt = 0;

        for (; nCnt < effectCtrl.m_nNumOfEffects; nCnt++)
        {
            if (nCnt >= effectCtrl.m_kEffectGenList.Count)
            {
                effectCtrl.m_kEffectGenList.Add(new EffectData());
            }

            EffectData effectData = effectCtrl.m_kEffectGenList [nCnt];
            if (effectData == null)
            {
                continue;
            }
            if (bShowAll)
            {
                effectData.m_bFoldoutOpen = true;
            }
            if (bHideAll)
            {
                effectData.m_bFoldoutOpen = false;
            }

            effectData.m_bFoldoutOpen = EditorGUILayout.Foldout(effectData.m_bFoldoutOpen, ("Effect " + nCnt + " Setting"));
            if (effectData.m_bFoldoutOpen)
            {
                effectData.m_fTimeSec = EditorGUILayout.FloatField("Shot Time", effectData.m_fTimeSec);
                effectData.m_goEffect = EditorGUILayout.ObjectField("Obj", effectData.m_goEffect, typeof(GameObject), true) as GameObject;

                EditorGUI.indentLevel++;
                /// Transform panel.
                effectData.m_bTransformFoldout = EditorGUILayout.Foldout(effectData.m_bTransformFoldout, "Transform");
                if (effectData.m_bTransformFoldout)
                {
                    EditorGUI.indentLevel++;
                    EditorGUI.BeginChangeCheck();
                    GUILayout.BeginHorizontal();
                    if (GUILayout.Button("P", GUILayout.Width(25), GUILayout.ExpandWidth(false)))
                    {
                        effectData.m_goPos = new Vector3(0, 0, 0);
                    }
                    effectData.m_goPos = EditorGUILayout.Vector3Field("", effectData.m_goPos);
                    GUILayout.EndHorizontal();
                    GUILayout.BeginHorizontal();
                    if (GUILayout.Button("R", GUILayout.Width(25), GUILayout.ExpandWidth(false)))
                    {
                        effectData.m_goRotation = new Vector3(0, 0, 0);
                    }
                    effectData.m_goRotation = EditorGUILayout.Vector3Field("", effectData.m_goRotation);
                    GUILayout.EndHorizontal();
                    GUILayout.BeginHorizontal();
                    if (GUILayout.Button("S", GUILayout.Width(25), GUILayout.ExpandWidth(false)))
                    {
                        effectData.m_goScale = new Vector3(0, 0, 0);
                    }
                    effectData.m_goScale = EditorGUILayout.Vector3Field("", effectData.m_goScale);
                    GUILayout.EndHorizontal();
                    if (EditorGUI.EndChangeCheck())
                    {
                        effectCtrl.UpdateEffectTransformByIndex(nCnt);
                    }
                    EditorGUI.indentLevel--;
                }

                ParticleSystem particleSystem = effectCtrl.CheckHasParticleSystem(nCnt);
                RenderEffect   renderEffect   = effectCtrl.CheckHasRenderEffectScript(nCnt);
                if (particleSystem == null)
                {
                    effectData.m_bSortingFoldout = EditorGUILayout.Foldout(effectData.m_bSortingFoldout, "Sorting Layer");
                    /// Sorting panel.
                    if (effectData.m_bSortingFoldout)
                    {
                        EditorGUI.indentLevel++;
                        EditorGUI.BeginChangeCheck();
                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Sorting Layer");
                        effectData.m_SortingLayerID = EditorGUILayout.IntPopup(effectData.m_SortingLayerID, m_LayerName, m_LayerID);
                        EditorGUILayout.EndHorizontal();

                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Sorting Order");
                        effectData.m_SortingOrder = EditorGUILayout.IntField(effectData.m_SortingOrder);
                        EditorGUILayout.EndHorizontal();
                        if (EditorGUI.EndChangeCheck())
                        {
                            if (renderEffect != null)
                            {
                                renderEffect.m_SortingLayerID     = effectData.m_SortingLayerID;
                                renderEffect.m_SortingOrder       = effectData.m_SortingOrder;
                                renderEffect.m_EnableSetSortLayer = true;
                                renderEffect.UpdateRenderLayer();
                            }
                            else
                            {
                                effectCtrl.UPdateRenderLayerByIndex(nCnt);
                            }
                        }
                        EditorGUI.indentLevel--;
                    }
                }
                EditorGUI.indentLevel--;
            }

            if (nCnt != effectCtrl.m_nNumOfEffects - 1)
            {
                EditorGUILayout.LabelField("", GUILayout.Height(2));
                GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1));
                EditorGUILayout.LabelField("", GUILayout.Height(2));
            }
        }

        for (; nCnt < effectCtrl.m_kEffectGenList.Count; nCnt++)
        {
            effectCtrl.m_kEffectGenList.RemoveAt(nCnt);
        }

        EditorGUILayout.EndVertical();
    }