void CreateNode(vWaypointArea wayArea, Vector3 position)
        {
            var nodeObj = new GameObject("node");
            var node    = nodeObj.AddComponent <vWaypoint>();

            node.subPoints             = new List <vPoint>();
            nodeObj.transform.position = position;
            nodeObj.transform.parent   = wayArea.transform;
            wayArea.waypoints.Add(node);
            currentNode     = node;
            indexOfWaypoint = wayArea.waypoints.IndexOf(currentNode);
        }
        void OnEnable()
        {
            pathArea = (vWaypointArea)target;
            if (pathArea.waypoints == null)
            {
                pathArea.waypoints = new List <vWaypoint>();
            }
            if (pathArea.waypoints.Count > 0)
            {
                currentNode = pathArea.waypoints[0];
            }

            EditorApplication.playmodeStateChanged = HandleOnPlayModeChanged;
            SetVisiblePoints(false);
        }
 void CreatePatrolPoint(vWaypointArea wayArea, Vector3 position)
 {
     if (currentNode)
     {
         if (currentNode.subPoints == null)
         {
             currentNode.subPoints = new List <vPoint>();
         }
         var nodeObj = new GameObject("patrolPoint");
         var node    = nodeObj.AddComponent <vPoint>();
         nodeObj.transform.position = position;
         nodeObj.transform.parent   = currentNode.transform;
         currentNode.subPoints.Add(node);
         indexOfPatrolPoint = currentNode.subPoints.IndexOf(node);
     }
 }
        public override void OnInspectorGUI()
        {
            if (skin == null)
            {
                skin = Resources.Load("skin") as GUISkin;
            }
            GUI.skin = skin;
            //base.DrawDefaultInspector();
            _wayArea = new SerializedObject(target);
            var waypoints = _wayArea.FindProperty("waypoints");

            pathArea = (vWaypointArea)target;

            GUILayout.BeginVertical("Waypoint Area", "window", GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(true));
            GUILayout.Space(40);
            if (GUILayout.Button(editMode ? "Exit Edit Mode" : "Enter Edit Mode", GUILayout.ExpandWidth(true)))
            {
                editMode = !editMode;
                if (!editMode)
                {
                    Selection.activeGameObject = pathArea.gameObject;
                }
                ActiveEditorTracker.sharedTracker.isLocked = editMode;
                SetVisiblePoints(editMode);
                Repaint();
            }
            GUI.color   = Color.white;
            GUI.enabled = editMode;
            EditorGUILayout.Space();

            if (editMode && pathArea.waypoints.Count == 0)
            {
                EditorGUILayout.HelpBox("Starting by holding Shift and Left Click on any surface with a collider.", MessageType.Info);
            }

            if (pathArea.waypoints != null && pathArea.waypoints.Count > 0)
            {
                for (int i = 0; i < waypoints.arraySize; i++)
                {
                    GUI.color = (i.Equals(indexOfWaypoint) ? Color.green : Color.white);
                    GUILayout.BeginHorizontal();
                    if (GUILayout.Button("Waypoint " + (i + 1).ToString("00"), "box", GUILayout.ExpandWidth(true)))
                    {
                        indexOfWaypoint            = i;
                        currentNode                = pathArea.waypoints[i];
                        Selection.activeGameObject = currentNode.gameObject;
                        SceneView.lastActiveSceneView.FrameSelected();
                    }
                    if (!PointIsInNavMesh(pathArea.waypoints[i].transform.position))
                    {
                        GUI.color = Color.white;
                        EditorGUILayout.HelpBox("Out of NavMesh", MessageType.Error);
                        Repaint();
                    }
                    EditorGUILayout.Space();

                    if (GUILayout.Button("x", GUILayout.MaxWidth(20)))
                    {
                        RemoveNode(ref waypoints, i);
                        GUILayout.EndVertical();
                        break;
                    }
                    GUILayout.EndHorizontal();
                    EditorGUILayout.Space();
                }
            }

            GUI.color = Color.white;
            if (indexOfWaypoint >= waypoints.arraySize)
            {
                indexOfWaypoint = waypoints.arraySize - 1;
            }
            try
            {
                if (waypoints != null && waypoints.arraySize > 0)
                {
                    var vPoint = new SerializedObject(waypoints.GetArrayElementAtIndex(indexOfWaypoint).objectReferenceValue as vWaypoint);
                    DrawWaypoint(vPoint, waypoints);
                }
            }
            catch { }
            GUILayout.EndVertical();
            GUI.enabled = true;
            GUILayout.BeginVertical("Hot Keys", "window");
            GUILayout.Space(40);
            hotKeys = GUILayout.Toggle(hotKeys, hotKeys ? "Hide Hot Keys" : "Show Hot Keys", "button", GUILayout.ExpandWidth(true));
            if (hotKeys)
            {
                GUILayout.BeginVertical("box");
                GUI.color = Color.green;
                GUILayout.Label("Shift + Left Mouse Click", "box");
                GUI.color = Color.white;
                GUILayout.Label("Create New Way Point");
                GUILayout.EndVertical();
                EditorGUILayout.Separator();

                GUILayout.BeginVertical("box");
                GUI.color = Color.green;
                GUILayout.Label("Ctrl + Left Mouse Click", "box");
                GUI.color = Color.white;
                GUILayout.Label("Create New Patrol Point to selected way point");
                GUILayout.EndVertical();
                EditorGUILayout.Separator();

                GUILayout.BeginVertical("box");
                GUI.color = Color.green;
                GUILayout.Label("Shift + Right Mouse Click", "box");
                GUI.color = Color.white;
                GUILayout.Label("Set click point position to way point selected");
                GUILayout.EndVertical();
                EditorGUILayout.Separator();

                GUILayout.BeginVertical("box");
                GUI.color = Color.green;
                GUILayout.Label("Ctrl + Right Mouse Click", "box");
                GUI.color = Color.white;
                GUILayout.Label("Set click point position to patrol point selected");
                GUILayout.EndVertical();
                EditorGUILayout.Separator();
            }
            EditorGUILayout.Separator();

            GUILayout.EndVertical();
            if (Event.current.commandName == "UndoRedoPerformed")
            {
                Repaint();
            }
            if (GUI.changed)
            {
                _wayArea.ApplyModifiedProperties();
                EditorUtility.SetDirty(pathArea);
            }
        }