示例#1
0
        private IActorTask HandleBypassMode()
        {
            if (_moveTask == null)
            {
                return(CreateBypassMoveTask());
            }
            else
            {
                if (!_moveTask.IsComplete)
                {
                    // Если команда на перемещение к целевой точке патруля не закончена, тогда продолжаем её.
                    return(_moveTask);
                }

                // Команда на перемещение к целевой точке патруля закончена.
                // Нужно выбрать следующую целевую точку и создать команду на простой.
                _patrolPointIndex++;
                if (_patrolPointIndex >= _patrolRoute.Points.Count())
                {
                    _patrolPointIndex = 0;
                }

                _moveTask = null;
                _idleTask = new IdleTask(_actor, _decisionSource);
                _mode     = PatrolMode.Idle;
                return(_idleTask);
            }
        }
示例#2
0
 void PatrolChangeToRotate()
 {
     patrolMode         = PatrolMode.ROTATE;
     patrolRotateRandom = Random.Range(0.75f, 1.25f);
     patrolDir          = Random.Range(0, 2) == 1 ? -1 : 1;
     patrolCounterMax   = Random.Range(patrolRotateTime.x, patrolRotateTime.y);
 }
示例#3
0
 void PatrolBoundsUpdate()
 {
     if (patrolMode == PatrolMode.HorizontallyRight && transform.position.x >= startingPosition.x + maxHorizontalMovement)
     {
         patrolMode = PatrolMode.HorizontallyLeft;
     }
     else if (patrolMode == PatrolMode.HorizontallyLeft && transform.position.x <= startingPosition.x - minHorizontalMovement)
     {
         patrolMode = PatrolMode.HorizontallyRight;
     }
     else if (patrolMode == PatrolMode.VerticallyUp && transform.position.y >= startingPosition.y + maxVerticalMovement)
     {
         patrolMode = PatrolMode.VerticallyDown;
     }
     else if (patrolMode == PatrolMode.VerticallyDown && transform.position.y <= startingPosition.y - minVerticalMovement)
     {
         patrolMode = PatrolMode.VerticallyUp;
     }
 }
示例#4
0
    //Inspector Draw
    private void Awake()
    {
        //Class
        t = target as AI_Patrol;

        if (EditorPrefs.HasKey("PatrolSettingsPath"))
        {
            settings = (AI_PatrolSettings)AssetDatabase.LoadAssetAtPath(EditorPrefs.GetString("PatrolSettingsPath"), typeof(AI_PatrolSettings));
            SetData();
        }

        //Variables
        patrolOptions    = Enum.GetNames(typeof(PatrolMode)); //Get all the enum types
        pointMoveOptions = Enum.GetNames(typeof(PointMovement));

        patrolMode         = t.patrolMode; //Get enum type for ref later on
        patrolOptionsIndex = (int)patrolMode;

        pointMovement     = PointMovement.XZ; //Get enum type for ref later on
        pointOptionsIndex = (int)pointMovement;
    }
示例#5
0
        public IActorTask GetCurrentTask()
        {
            // На каждом шаге осматриваем окрестности
            // напредмет нарушителей.
            var intruders = CheckForIntruders();

            var nearbyIntruder = intruders.FirstOrDefault();

            if (nearbyIntruder != null)
            {
                _mode             = PatrolMode.Pursuit;
                _targetIntruder   = nearbyIntruder;
                _idleTask         = null;
                _patrolPointIndex = null;
            }
            else if (_idleTask?.IsComplete == true)
            {
                _mode           = PatrolMode.Bypass;
                _targetIntruder = null;
                _idleTask       = null;
            }

            switch (_mode)
            {
            case PatrolMode.Bypass:
                return(HandleBypassMode());

            case PatrolMode.Pursuit:
                return(HandlePersiutMode());

            case PatrolMode.Idle:
                return(HandleIdleMode());

            default:
                throw new InvalidOperationException($"Неизвестный режим патруллирования {_mode}");
            }
        }
示例#6
0
        protected override void DrawStateInspectorEditor(SerializedObject m_Object, AIBehaviors stateMachine)
        {
            SerializedObject   m_State = new SerializedObject(this);
            SerializedProperty m_property;

            m_State.Update();

            // === Handle other properties === //

            EditorGUILayout.Separator();

            GUILayout.Label("Patrol Properties:", EditorStyles.boldLabel);

            GUILayout.BeginVertical(GUI.skin.box);
            GUILayout.Label("Movement Options:", EditorStyles.boldLabel);

            PatrolMode patrolMode;

            m_property = m_State.FindProperty("patrolMode");
            EditorGUILayout.PropertyField(m_property);
            patrolMode = (PatrolMode)m_property.enumValueIndex;

            m_property = m_State.FindProperty("continuePatrolMode");
            EditorGUILayout.PropertyField(m_property, new GUIContent("Continue Previous Patrol", "When this state is switched back to, will it continue where it left off?"));

            if (patrolMode == PatrolState.PatrolMode.Once)
            {
                GUILayout.BeginHorizontal();
                {
                    GUILayout.Label("End Patrol Transition:");
                    m_property = m_State.FindProperty("patrolEndedState");
                    m_property.objectReferenceValue = AIBehaviorsStatePopups.DrawEnabledStatePopup(stateMachine, m_property.objectReferenceValue as BaseState);
                }
                GUILayout.EndHorizontal();
            }

            // Handle the patrol points

            if (patrolPoints == null)
            {
                patrolPoints = new Transform[0];
            }

            EditorGUILayout.Separator();

            m_property = m_State.FindProperty("patrolPointsGroup");
            EditorGUILayout.PropertyField(m_property);

            m_property = m_State.FindProperty("pointDistanceThreshold");
            EditorGUILayout.PropertyField(m_property, new GUIContent("Distance Threshold"));

            if (m_property.floatValue < 0.0f)
            {
                m_property.floatValue = 0.0f;
            }

            m_property = m_State.FindProperty("useAccurateCornering");
            EditorGUILayout.PropertyField(m_property, new GUIContent("Accurate Cornering"));

            if (m_property.boolValue)
            {
                m_property = m_State.FindProperty("corneringError");
                EditorGUILayout.PropertyField(m_property, new GUIContent("Cornering Error"));

                if (m_property.intValue <= 0)
                {
                    m_property.intValue = 1;
                }
            }

            GUILayout.EndVertical();

            m_State.ApplyModifiedProperties();
        }
示例#7
0
    //Setting Buttons/UI
    private void PatrolSettings()
    {
        //Patrol Mode Selection
        GUILayout.BeginArea(new Rect(10, 10, 250, 160));

        //Show Patrol modes
        GUILayout.Label("Patrol Modes", EditorStyles.boldLabel);
        int patrolIndex = GUILayout.SelectionGrid(patrolOptionsIndex, patrolOptions, 2);

        GUILayout.Label("Point Movement Mode", EditorStyles.boldLabel);

        GUILayout.BeginHorizontal();
        GUILayout.BeginVertical();
        xLock = GUILayout.Toggle(xLock, "X");
        yLock = GUILayout.Toggle(yLock, "Y");
        zLock = GUILayout.Toggle(zLock, "Z");
        GUILayout.EndVertical();

        if (GUILayout.Button("Lock Points"))
        {
            xLock = false;
            yLock = false;
            zLock = false;
        }
        GUILayout.EndHorizontal();

        DraggableDir.x = (xLock) ? 1 : 0;
        DraggableDir.y = (yLock) ? 1 : 0;
        DraggableDir.z = (zLock) ? 1 : 0;


        // GUILayout.Label ("Point Movement Mode", EditorStyles.boldLabel);
        // int pointIndex = GUILayout.SelectionGrid (pointOptionsIndex, pointMoveOptions, 2);

        //Make sure that the GUI has been pressed and update it from there
        if (GUI.changed)
        {
            //Add to undo list
            Undo.RecordObject(t, "Changed point position");

            //Set data to changed
            patrolMode         = (PatrolMode)patrolIndex;
            t.patrolMode       = patrolMode;
            patrolOptionsIndex = patrolIndex;

            //pointMovement = (PointMovement)pointIndex;
            //pointOptionsIndex = pointIndex;
        }

        GUILayout.EndArea();

        //State that the settings cannot be changed whilst playing
        if (EditorApplication.isPlaying)
        {
            GUILayout.BeginArea(new Rect(10, 180, 250, 30));
            GUILayout.Label("Settings are disabled when game is active");
            GUILayout.EndArea();

            return;
        }

        //Patrol Mode Settings
        GUILayout.BeginArea(new Rect(10, 150, 250, 80));
        GUILayout.Label("Patrol Quick Settings", EditorStyles.boldLabel);

        //Focus on the current object selected
        //HandleExt.CreateButton ("Change to a Top-view of path", GUILayout.Width (250), SceneView.lastActiveSceneView.FrameSelected ());

        //Move to origin point ready for patrol
        switch (patrolMode)
        {
        case PatrolMode.FollowPoints:
            if (GUILayout.Button("Move to Origin Point", GUILayout.Width(250)))
            {
                t.gameObject.transform.position = points[0].point;
                currentPoint = 0;
            }

            GUILayout.BeginHorizontal();

            if (GUILayout.Button("Next Point"))
            {
                currentPoint = (currentPoint == points.Length - 1 ? 0 : currentPoint + 1);
                t.gameObject.transform.position = points[currentPoint].point;
            }

            if (GUILayout.Button("Previous Point"))
            {
                currentPoint = (currentPoint == 0 ? points.Length - 1 : currentPoint - 1);
                t.gameObject.transform.position = points[currentPoint].point;
            }

            GUILayout.EndHorizontal();
            break;

        case PatrolMode.RandomPoint:
            if (GUILayout.Button("Move to Random Point", GUILayout.Width(250)))
            {
                t.gameObject.transform.position = t.GetNextPoint();
            }
            break;
        }

        GUILayout.EndArea();

        //NavMesh Generation
        GUILayout.BeginArea(new Rect(300, 10, 350, 100));
        GUILayout.Label("NavMesh Path Generation", EditorStyles.boldLabel);

        GUILayout.BeginHorizontal();
        bool calculatePath = GUILayout.Button("Generate Path", GUILayout.Width(124));
        bool clearPath     = GUILayout.Button("Clear Path", GUILayout.Width(124));

        GUILayout.EndHorizontal();

        GUILayout.Label("Will clear path on deselect", EditorStyles.miniBoldLabel);
        GUILayout.Label("Not accurate to agents - Points are equal to NavMesh corners", EditorStyles.miniBoldLabel);


        //Generate the path
        if (calculatePath)
        {
            pathPoints = CalculateNavMeshPath();
        }

        //Clear it since it's not needed anymore
        if (clearPath)
        {
            pathPoints = null;
        }


        GUILayout.EndArea();
    }
示例#8
0
    protected override void DrawStateInspectorEditor(SerializedObject m_Object, AIBehaviors stateMachine)
    {
        SerializedObject m_State = new SerializedObject(this);
        SerializedProperty m_property;

        m_State.Update();

        // === Handle other properties === //

        EditorGUILayout.Separator();
        GUILayout.Label("Movement Options:", EditorStyles.boldLabel);

        PatrolMode patrolMode;

        m_property = m_State.FindProperty("patrolMode");
        EditorGUILayout.PropertyField(m_property);
        patrolMode = (PatrolMode)m_property.enumValueIndex;

        m_property = m_State.FindProperty("continuePatrolMode");
        EditorGUILayout.PropertyField(m_property, new GUIContent("Continue Previous Patrol", "When this state is switched back to, will it continue where it left off?"));

        if ( patrolMode == PatrolState.PatrolMode.Once )
        {
            GUILayout.BeginHorizontal();
            {
                GUILayout.Label("End Patrol Transition:");
                m_property = m_State.FindProperty("patrolEndedState");
                m_property.objectReferenceValue = AIBehaviorsStatePopups.DrawEnabledStatePopup(stateMachine, m_property.objectReferenceValue as BaseState);
            }
            GUILayout.EndHorizontal();
        }

        // Handle the patrol points

        if ( patrolPoints == null )
            patrolPoints = new Transform[0];

        EditorGUILayout.Separator();
        GUILayout.Label("Patrol Points:", EditorStyles.boldLabel);

        m_property = m_State.FindProperty("patrolPointsGroup");
        EditorGUILayout.PropertyField(m_property);

        m_property = m_State.FindProperty("pointDistanceThreshold");
        EditorGUILayout.PropertyField(m_property, new GUIContent("Distance Threshold"));

        if ( m_property.floatValue < 0.0f )
            m_property.floatValue = 0.0f;

        m_State.ApplyModifiedProperties();
    }
示例#9
0
 void PatrolChangeToMove()
 {
     patrolMode       = PatrolMode.MOVE;
     patrolCounterMax = Random.Range(patrolMoveTime.x, patrolMoveTime.y);
 }