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); } }
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); }
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; } }
//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; }
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}"); } }
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(); }
//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(); }
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(); }
void PatrolChangeToMove() { patrolMode = PatrolMode.MOVE; patrolCounterMax = Random.Range(patrolMoveTime.x, patrolMoveTime.y); }