public void InitialiseFSM(string startingState, FSMLoader load, AIMotorActions aiM, AIConditionChecker aiC, Transform parentT) { loader = load; activeState = loader.GetState(startingState); motorActions = aiM; conditionChecker = aiC; parentTransform = parentT; fsmCounter = new FSMCounter(); fsmCounter.timer = 0f; fsmCounter.frames = 0; if (activeState.GetAction() == Action.RUN_SUB_FSM) { SpawnFSMStartingWithState(activeState.GetStartingSubstate()); } }
public bool TestCondition(Condition condition, float param, FSMCounter counter) { switch (condition) { case Condition.TIMER: { if (counter.timer > param) { return(true); } break; } case Condition.FRAMES: { if (counter.frames >= (Mathf.CeilToInt(param))) { return(true); } break; } case Condition.TARGET_IN_RADIUS: { if (Vector3.Magnitude(goals.GetTargetPosition() - parentTransform.position) < param) { return(true); } break; } case Condition.TARGET_OUTSIDE_RADIUS: { if (Vector3.Magnitude(goals.GetTargetPosition() - parentTransform.position) > param) { return(true); } break; } case Condition.TARGET_IN_LOS: { if (raycastSensors.IsGameobjectInLOS(goals.GetTargetObject())) { return(true); } break; } case Condition.TARGET_IN_OCTANT_BELOW: { FindTargetOctant(); if (horOctant == 0f && vertOctant < 0) { return(true); } break; } case Condition.TARGET_IN_OCTANT_ABOVE: { FindTargetOctant(); if (horOctant == 0f && vertOctant > 0) { return(true); } break; } case Condition.TARGET_IN_HORIZONTAL_OCTANTS: { FindTargetOctant(); if (horOctant != 0f && vertOctant == 0) { return(true); } break; } case Condition.TARGET_IN_FRONT_OCTANT: { FindTargetOctant(); if (horOctant == goals.GetForwardDirection() && vertOctant == 0) { return(true); } break; } case Condition.TARGET_IN_FRONT_HORIZONTAL: { FindTargetDistances(); if (Mathf.Sign(horDistance) == Mathf.Sign(goals.GetForwardDirection())) { if (Mathf.Abs(vertDistance) < verticalSpottingHeight) { return(true); } } break; } case Condition.CLIFF_LEFT: { if (raycastSensors.GetLeftCliff()) { return(true); } break; } case Condition.CLIFF_RIGHT: { if (raycastSensors.GetRightCliff()) { return(true); } break; } case Condition.CLIFF_FORWARD: { if (contactSensor.GetContactState() != ContactState.AIRBORNE) //Don't look for cliffs if already airborne... { if (goals.GetForwardDirection() == 1) { if (raycastSensors.GetRightCliff()) { return(true); } } else { if (raycastSensors.GetLeftCliff()) { return(true); } } } break; } case Condition.ALWAYS: { return(true); break; } } return(false); }