void OnEnable()
    {
        AgentGroupSettings targ = (AgentGroupSettings)target;

        mNamesAsset = AgentGroupNamesEditor.GetGlobalAsset();

        string[] names = mNamesAsset.groupNames;

        // Make sure the names asset is initialized.
        if (names == null || names.Length != AgentGroupNames.MaxGroups)
        {
            names = new string[AgentGroupNames.MaxGroups];

            for (int i = 1; i < names.Length; i++)
            {
                names[i] = AgentGroupNames.Undefined;
            }

            names[0] = "Default";

            mNamesAsset.groupNames = names;

            EditorUtility.SetDirty(mNamesAsset);
        }

        // Make sure settings are defined for names.
        for (int i = 0; i < names.Length; i++)
        {
            if (names[i] == AgentGroupNames.Undefined || targ.GetGroupIndex((byte)i) >= 0)
            {
                continue;
            }

            targ.AddGroup((byte)i);

            EditorUtility.SetDirty(target);
        }

        // Initialize the show flags.

        if (mShowGroup == null || mShowGroup.Length != names.Length)
        {
            mShowGroup = new bool[names.Length];
        }

        mAvoidanceNames = CAINavEditorSettingsEditor.GetAvoidanceNames();

        mNewArea = NextUndefined();
    }
    internal static void SelectAsset()
    {
        AgentGroupSettings item = EditorUtil.GetGlobalAsset <AgentGroupSettings>();

        Selection.activeObject = item;
    }
    /// <summary>
    /// Controls behavior of the inspector.
    /// </summary>
    public override void OnInspectorGUI()
    {
        AgentGroupSettings targ = (AgentGroupSettings)target;

        EditorGUILayout.Separator();

        int delTarget = -1;

        if (targ.GroupCount == 0)
        {
            // A reset, or something else odd happened.
            OnEnable();
        }

        string[] names = mNamesAsset.groupNames;

        bool blockDelete = (targ.GroupCount < 2);

        // Note: Because we are looping on the names, we are guarenteed to cover
        // all the definitions in the target.  names is always the most complete list.
        for (int iNames = 0; iNames < names.Length; iNames++)
        {
            int iTarg = targ.GetGroupIndex((byte)iNames);

            if (names[iNames] == AgentGroupNames.Undefined)
            {
                if (iTarg < 0)
                {
                    // It is truly undefined.
                    continue;
                }

                // Fix the error.  All defined groups must have a name.
                names[iNames] = "Agent Group " + iNames;
            }

            mShowGroup[iNames] = EditorGUILayout.Foldout(
                mShowGroup[iNames], string.Format("{0} ({1})", names[iNames], iNames));

            if (!mShowGroup[iNames])
            {
                continue;
            }

            EditorGUILayout.BeginHorizontal();

            string sn = EditorGUILayout.TextField("Name", names[iNames]);

            if (sn != names[iNames] &&
                sn != AgentGroupNames.Undefined)
            {
                bool foundDup = false;
                foreach (string n in names)
                {
                    if (sn == n)
                    {
                        foundDup = true;
                        break;
                    }
                }

                if (!foundDup)
                {
                    names[iNames] = sn;
                    EditorUtility.SetDirty(mNamesAsset);
                }
            }

            GUI.enabled = (!blockDelete);

            if (GUILayout.Button("X", GUILayout.Width(20)))
            {
                delTarget = iTarg;

                names[iNames] = AgentGroupNames.Undefined;
                EditorUtility.SetDirty(mNamesAsset);

                mShowGroup[iNames] = false;

                GUI.changed = true;
            }

            GUI.enabled = true;

            EditorGUILayout.EndHorizontal();

            float fv;

            fv = EditorGUILayout.FloatField("Agent Radius", targ.GetAgentRadius(iTarg));
            targ.SetAgentRadius(iTarg, fv);

            fv = EditorGUILayout.FloatField("Agent Height", targ.GetAgentHeight(iTarg));
            targ.SetAgentHeight(iTarg, fv);

            fv = EditorGUILayout.FloatField("Walk Speed", targ.GetMaxWalkSpeed(iTarg));
            targ.SetMaxWalkSpeed(iTarg, fv);

            fv = EditorGUILayout.FloatField("Jog Speed", targ.GetMaxJogSpeed(iTarg));
            targ.SetMaxJogSpeed(iTarg, fv);

            fv = EditorGUILayout.FloatField("Run Speed", targ.GetMaxRunSpeed(iTarg));
            targ.SetMaxRunSpeed(iTarg, fv);

            fv = EditorGUILayout.FloatField("Max Acceleration", targ.GetMaxAcceleration(iTarg));
            targ.SetMaxAcceleration(iTarg, fv);

            fv = EditorGUILayout.FloatField("Max Turn Speed", targ.GetMaxTurnSpeed(iTarg));
            targ.SetMaxTurnSpeed(iTarg, fv);

            fv = EditorGUILayout.FloatField("Query Range", targ.GetQueryRange(iTarg));
            targ.SetQueryRange(iTarg, fv);

            fv = EditorGUILayout.FloatField("Optimization Range", targ.GetOptimizationRange(iTarg));
            targ.SetOptimizationRange(iTarg, fv);

            fv = EditorGUILayout.FloatField("Separation Weight", targ.GetSeparationWeight(iTarg));
            targ.SetSeparationWeight(iTarg, fv);

            int iv;

            iv = EditorGUILayout.Popup(
                "Avoidance Quality", targ.GetAvoidanceType(iTarg), mAvoidanceNames);
            targ.SetAvoidanceType(iTarg, iv);

            CrowdUpdateFlags flags = (CrowdUpdateFlags)
                                     EditorGUILayout.EnumMaskField("Update Flags", targ.GetCrowdUpdateFlags(iTarg));
            targ.SetCrowdUpdateFlags(iTarg, flags);

            iv = EditorGUILayout.IntField("Corridor Pool Size", targ.GetCorridorPoolSize(iTarg));
            targ.SetCorridorPoolSize(iTarg, iv);

            iv = EditorGUILayout.IntField("Path Pool Size", targ.GetPathPoolSize(iTarg));
            targ.SetPathPoolSize(iTarg, iv);
        }

        if (delTarget >= 0)
        {
            // Note: The name is already taken care of.
            targ.RemoveGroup(delTarget);

            mNewArea  = NextUndefined();
            mFocusNew = true;  // So don't have odd GUI behavior.
        }

        EditorGUILayout.Separator();

        EditorGUILayout.BeginHorizontal();

        GUI.SetNextControlName(AddGroupName);
        mNewArea = (byte)Mathf.Min(
            AgentGroupNames.MaxGroups - 1, EditorGUILayout.IntField(mNewArea, GUILayout.Width(80)));
        if (mFocusNew)
        {
            GUI.FocusControl(AddGroupName);
            mFocusNew = false;
        }

        GUI.enabled = (names[mNewArea] == AgentGroupNames.Undefined);

        if (GUILayout.Button("Add New Group"))
        {
            names[mNewArea] = "Agent Group " + mNewArea;
            EditorUtility.SetDirty(mNamesAsset);

            targ.AddGroup(mNewArea);
            mShowGroup[mNewArea] = true;

            mNewArea    = NextUndefined();
            mFocusNew   = true;
            GUI.changed = true;
        }

        GUI.enabled = true;

        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Separator();

        EditorGUILayout.LabelField("Maximum allowed group id: " + (AgentGroupNames.MaxGroups - 1)
                                   , EditorUtil.HelpStyle, GUILayout.ExpandWidth(true));

        EditorGUILayout.Separator();

        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }
    }