public void ChangeLabelPrefab()
    {
        //set prefab dirty
        if (labelPrefab == null)
        {
            labelPrefab = Resources.Load <GameObject>("Prefabs/Label") as GameObject;
        }
        LabelTextManager prefabLabelManager = labelPrefab.GetComponent <LabelTextManager>();


        Undo.RecordObject(labelPrefab.transform, "make change to the line width, txetwindow and dot size");
        prefabLabelManager.SetDotSize(dotSize);
        prefabLabelManager.SetTextWindowSize(textWindowSize);
        prefabLabelManager.SetLineWidth(lineWidthMultiplier);
        prefabLabelManager.SetTextColor(textColor);
        PrefabUtility.RecordPrefabInstancePropertyModifications(labelPrefab.transform);

        //change line width, color, window size and text size in exsisting labels
        if (labels.Count > 0)
        {
            labels.ForEach(x => {
                x.SetDotSize(dotSize);
                x.SetTextWindowSize(textWindowSize);
                x.SetLineWidth(lineWidthMultiplier);
                x.SetTextColor(textColor);
            });
        }
    }
    //GUI displayed in insepector
    public override void OnInspectorGUI()
    {
        #region Input_Number_Field
        EditorGUI.BeginChangeCheck();
        mytarget.thisLabel.index = EditorGUILayout.IntField("Index", mytarget.thisLabel.index);
        if (GUI.changed)
        {
            mytarget.SetIndexNumber(mytarget.thisLabel.index);
        }
        EditorGUI.EndChangeCheck();
        #endregion
        #region Label_Text_Field
        EditorGUI.BeginChangeCheck();
        EditorGUILayout.BeginHorizontal();

        EditorGUILayout.LabelField("Upper Label Text");
        EditorGUILayout.LabelField("Bottom Label Text");

        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();

        mytarget.thisLabel.upperText  = EditorGUILayout.TextField(mytarget.thisLabel.upperText);
        mytarget.thisLabel.bottomText = EditorGUILayout.TextField(mytarget.thisLabel.bottomText);
        if (GUI.changed)
        {
            mytarget.SetText(mytarget.thisLabel.upperText, mytarget.thisLabel.bottomText);
        }

        EditorGUILayout.EndHorizontal();
        EditorGUI.EndChangeCheck();
        #endregion
        #region Label_Position_Field
        EditorGUI.BeginChangeCheck();
        mytarget.thisLabel.dotPosition        = EditorGUILayout.Vector3Field("Label Dot Position", mytarget.thisLabel.dotPosition);
        mytarget.thisLabel.textWindowPosition = EditorGUILayout.Vector3Field("Text Window Position", mytarget.thisLabel.textWindowPosition);
        if (GUI.changed)
        {
            mytarget.SetDotPosition(mytarget.thisLabel.dotPosition);
            mytarget.SetTextWindowPosition(mytarget.thisLabel.textWindowPosition);
        }
        EditorGUI.EndChangeCheck();
        #endregion
        #region Sizes_Field
        EditorGUI.BeginChangeCheck();

        mytarget.thisLabel.dotSize             = EditorGUILayout.Slider("Label Dot Size", mytarget.thisLabel.dotSize, 0.001f, 50f);
        mytarget.thisLabel.textWindowSize      = EditorGUILayout.Slider("Text Window Size", mytarget.thisLabel.textWindowSize, 0.001f, 50f);
        mytarget.thisLabel.lineWidthMultiplier = EditorGUILayout.Slider("Line Width", mytarget.thisLabel.lineWidthMultiplier, 0.1f, 50f);
        if (GUI.changed)
        {
            mytarget.SetDotSize(mytarget.thisLabel.dotSize);
            mytarget.SetTextWindowSize(mytarget.thisLabel.textWindowSize);
            mytarget.SetLineWidth(mytarget.thisLabel.lineWidthMultiplier);
        }
        EditorGUI.EndChangeCheck();
        #endregion
        #region Color_Field
        EditorGUI.BeginChangeCheck();
        mytarget.textColor = EditorGUILayout.ColorField("Text Color", mytarget.textColor, GUILayout.Width(200));
        if (GUI.changed)
        {
            mytarget.SetTextColor(mytarget.textColor);
        }
        EditorGUI.EndChangeCheck();
        #endregion
        #region Display_Label_Toggle
        mytarget.thisLabel.isLabelDisplayed = EditorGUILayout.Toggle("Display Label", mytarget.thisLabel.isLabelDisplayed);
        if (GUI.changed)
        {
            mytarget.showLabel(mytarget.thisLabel.isLabelDisplayed);
        }
        #endregion
        #region Serialized_Field
        //In case the object reference is missing, user will need assign scene objects again
        if (upperTextmeshProperty.objectReferenceValue == null)
        {
            upperTextmeshProperty.objectReferenceValue = (TMPro.TextMeshPro)EditorGUILayout.ObjectField("Upper Text Mesh", upperTextmeshProperty.objectReferenceValue, typeof(TMPro.TextMeshPro), true);
        }
        if (bottomTextmeshProperty.objectReferenceValue == null)
        {
            bottomTextmeshProperty.objectReferenceValue = (TMPro.TextMeshPro)EditorGUILayout.ObjectField("Bottom Text Mesh", bottomTextmeshProperty.objectReferenceValue, typeof(TMPro.TextMeshPro), true);
        }
        if (indexTextmeshProperty.objectReferenceValue == null)
        {
            indexTextmeshProperty.objectReferenceValue = (TMPro.TextMeshPro)EditorGUILayout.ObjectField("Index Text Mesh", indexTextmeshProperty.objectReferenceValue, typeof(TMPro.TextMeshPro), true);
        }
        if (lineProperty.objectReferenceValue == null)
        {
            lineProperty.objectReferenceValue = (LineRenderer)EditorGUILayout.ObjectField("Indication Line Renderer", lineProperty.objectReferenceValue, typeof(LineRenderer), true);
        }
        if (dotGroupProperty.objectReferenceValue == null)
        {
            dotGroupProperty.objectReferenceValue = (GameObject)EditorGUILayout.ObjectField("Dot Group Game Object", dotGroupProperty.objectReferenceValue, typeof(GameObject), true);
        }
        if (textGroupProperty.objectReferenceValue == null)
        {
            textGroupProperty.objectReferenceValue = (GameObject)EditorGUILayout.ObjectField("Dot Group Game Object", textGroupProperty.objectReferenceValue, typeof(GameObject), true);
        }
        serializedObject.ApplyModifiedProperties();
        #endregion

        #region Delete_Button
        if (GUILayout.Button("Delete This Label", GUILayout.Height(30), GUILayout.Width(200)))
        {
            mytarget.DeleteLabel();
        }
        #endregion
        #region Reload_Button
        if (GUILayout.Button("Reload This Label", GUILayout.Height(30), GUILayout.Width(200)))
        {
            mytarget.ReloadLabel();
        }
        #endregion
    }