public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        var rect = EditorGUILayout.GetControlRect();

        /*----------- uuid suffix -------------*/
        uuidSuffix = LocalDataUtil.Get(GameManager.PREFS_UUID_SUFFIX, "");
        uuidSuffix = EditorGUILayout.TextField("UUID SUFFIX", uuidSuffix);
        LocalDataUtil.Set(GameManager.PREFS_UUID_SUFFIX, uuidSuffix);


        /*----------- custom ip -----------------*/
        m_selected  = LocalDataUtil.Get(PREFS_SELECTED_CUSTOM_ADDRESS, (int)0);
        rect        = EditorGUILayout.GetControlRect();
        rect.width -= 40f;
        m_selected  = EditorGUI.Popup(rect, "Main Server Address", m_selected, dataList.serverIPDescriptions);
        LocalDataUtil.Set(PREFS_SELECTED_CUSTOM_ADDRESS, m_selected);
        serverAddress = dataList.serverIPs[m_selected];
        LocalDataUtil.Set(GameManager.PREFS_SERVER_ADDRESS, serverAddress);


        rect.x    += rect.width;
        rect.width = 20f;
        if (GUI.Button(rect, "+"))
        {
            currentIP = !currentIP;
            tempName  = "";
            tempValue = "";
        }
        rect.x += 20f;
        if (GUI.Button(rect, "-"))
        {
            if (m_selected > 0 && m_selected < dataList.serverIPs.Length)
            {
                var ips   = dataList.serverIPs.ToListFromPool();
                var names = dataList.serverIPDescriptions.ToListFromPool();
                ips.RemoveAt(m_selected);
                names.RemoveAt(m_selected);
                dataList.serverIPs            = ips.ToArray();
                dataList.serverIPDescriptions = names.ToArray();
                ips.ReleaseToPool();
                names.ReleaseToPool();
                m_selected = 0;
                LocalDataUtil.Set(PREFS_SELECTED_CUSTOM_ADDRESS, m_selected);
                SaveFile();
            }
        }

        if (currentIP)
        {
            tempName  = EditorGUILayout.TextField("New Name", tempName).Trim();
            tempValue = EditorGUILayout.TextField("New IP", tempValue).Trim();
            rect      = EditorGUILayout.GetControlRect();
            if (GUI.Button(rect, "save"))
            {
                currentIP = false;
                var newips = dataList.serverIPs.ToListFromPool();
                if (!newips.Contains(tempValue))
                {
                    var newnames = dataList.serverIPDescriptions.ToListFromPool();
                    newnames.Add(tempName);
                    newips.Add(tempValue);
                    dataList.serverIPs            = newips.ToArray();
                    dataList.serverIPDescriptions = newnames.ToArray();
                    newnames.ReleaseToPool();
                    SaveFile();
                }
                newips.ReleaseToPool();
            }
        }


        /*-------------- Trigger Heartbeat Timeout -------------*/
        if (Application.isPlaying && GUILayout.Button("Trigger Heartbeat Timeout(Main)"))
        {
            if (NetworkManager.instance != null && NetworkManager.instance.main != null)
            {
                NetworkManager.instance.main.heartbeat.TestTriggerTimeout();
            }
        }

        if (Application.isPlaying && GUILayout.Button("Trigger Heartbeat Timeout(Battle)"))
        {
            if (NetworkManager.instance != null && NetworkManager.instance.battle != null)
            {
                NetworkManager.instance.battle.heartbeat.TestTriggerTimeout();
            }
        }
    }