/** * Each frame, the current state must provide five things: * * Vector3 targetPosition = the position in the world that the helicopter should fly to * float currSpeed = the speed that the helicopter should move towards that position * Quaternion desiredSpotlightRotation = the Quaternion representation of the rotation that the spotlight should rotate towards * float spotlightMoveSpeed = the speed that the spotlight should rotate towards that rotation * bool newDirection = For this frame, newDirection = 1 if movingRight should be changed, 0 if it should stay the same. */ private void updateState() { state = state.updateState(Time.deltaTime); movingRight = (state.newDirection()) ? !movingRight : movingRight; transform.position = Vector3.MoveTowards(transform.position, state.getTargetPosition(), state.getCurrSpeed() * Time.deltaTime); spotlight.transform.rotation = Quaternion.RotateTowards(spotlight.transform.rotation, state.getTargetSpotlightRotation(), state.getSpotlightRotationSpeed() * Time.deltaTime); }
public SearchInFrenzyState(HeliScript helicopter, float deltaTime, PursuitState comingFrom, HelicopterState afterLosing) { Debug.Log("Searching"); //Initializing default, independent vals for behavioral variables this.helicopter = helicopter; this.comingFrom = comingFrom; goBackToPursuit = false; ifLost = afterLosing; //Interacting with the frenzy controller frenzy = GameObject.Find("FrenzyController").GetComponent <FrenzyMode>(); rootPos = frenzy.getLastKnownPlayerPosition(); rootPos.y += helicopter.vertDistanceFromPlayerInChase; //Getting the actual player we're chasing down player = GameObject.Find("Player"); lastSeenToRight = player.transform.position.x > rootPos.x; targetPosition = rootPos + new Vector3(searchDist, 0, 0); targetSpotlightRotation = helicopter.getSpotlight().transform.rotation; //These two variables are never updated during pursuit state currSpeed = helicopter.speed * helicopter.frenzySpeedBonus; spotlightRotationSpeed = helicopter.spotlightRotationSpeedChase; //Updates to be ready for the first frame updateState(deltaTime); }
/** * The default constructor for FlipState. * This makes the assumption that we can finish this FlipState with * the position of the helicopter after the flip as the root, and then * begin the movement pattern from there (starting sine wave at t=0). * Because of this, this shouldn't be called by IdleState, as it can * result in the helicopter repeatedly changing it's anchor height after * every flip, over time making the helicopter descend or ascend significantly */ public FlipState(HeliScript helicopter, float deltaTime, HelicopterState toReturnTo) { //Initializing default, independent vals for behavioral variables this.helicopter = helicopter; timeIntoFlip = 0f; haveFlipped = false; flippedThisFrame = false; rootPosition = toReturnTo.getTargetPosition(); rootPosition.y -= helicopter.yOffsetMovement.indexedValue(); //since we adjust for bob, remove from root position this.toReturnTo = toReturnTo; justSawPlayer = false; initialSpeed = (helicopter.getMovingRight()) ? helicopter.speed : -helicopter.speed; //initalize debug vars //currSpeedDebug = new List<float>(); //targetPositionDebug = new List<float> (); //Shortcuts for accessing frequent variables without reaching back into helicopter each time lengthOfFlipInSeconds = helicopter.flipTime; halfwayPoint = lengthOfFlipInSeconds / 2; spotlightRotationBeforeFlip = helicopter.getSpotlight().transform.rotation; //Only need to calculate new spotlight rotation once, as it is simply the negated spotlight's rotation along the z axis targetSpotlightRotation = calculateNewSpotlightRotation(); //Similarly, only need to calculate spotlight rotation speed once, as it's just the value that is scaled by time //to allow the spotlight to rotate smoothly and end exactly on the rotation point at helicopter.flipTime seconds spotlightRotationSpeed = calculateSpotlightRotationSpeed(targetSpotlightRotation.eulerAngles.z); //Must call this once during the constructor so that we have values initiated for the first frame of it's instantiation updateState(deltaTime); }
void Start() { frenzy = GameObject.Find("FrenzyController").GetComponent <FrenzyMode>(); //Gets important components for behavior sr = GetComponent <SpriteRenderer> (); spotlight = GameObject.Find("2DLight"); initializeSinusoidals(); //begins helicopter behavior state = new IdleState(this, Time.deltaTime); }
/** * Checks to see if a new state is required, and if so, returns that new state */ public HelicopterState updateState(float deltaTime) { //Logic for checking whether there should be a new state if (toDoFirst != null) { HelicopterState temp = toDoFirst; toDoFirst = null; return(temp); } if (helicopter.transform.position.Equals(targetPosition)) { return(nextState); } return(this); }
//Constructor run when creating IdleState public ReturnToStateState(HeliScript helicopter, float deltaTime, HelicopterState toReturnTo) { this.helicopter = helicopter; nextState = toReturnTo; targetPosition = nextState.getTargetPosition(); spotlightRotationSpeed = nextState.getSpotlightRotationSpeed(); targetSpotlightRotation = nextState.getTargetSpotlightRotation(); currSpeed = helicopter.speed; if ((helicopter.getMovingRight() && toReturnTo.getTargetPosition().x < helicopter.transform.position.x) || (!helicopter.getMovingRight() && toReturnTo.getTargetPosition().x > helicopter.transform.position.x)) { //We gotta turn around first toDoFirst = new FlipState(helicopter, deltaTime, this); } updateState(deltaTime); }
//rootState needs to be the staet that the helicopter will return to after the player escapes public PursuitState(HeliScript helicopter, float deltaTime, HelicopterState rootState) { //Initializing default, independent vals for behavioral variables this.helicopter = helicopter; this.cameFrom = rootState; heightFromPlayer = helicopter.vertDistanceFromPlayerInChase; timeSincePlayerSeen = 0f; //Getting the actual player we're chasing down player = GameObject.Find("Player"); //Interacting with the frenzy controller frenzy = GameObject.Find("FrenzyController").GetComponent <FrenzyMode>(); frenzy.canSeePlayer(this.helicopter); //These two variables are never updated during pursuit state currSpeed = helicopter.speed * helicopter.frenzySpeedBonus; spotlightRotationSpeed = helicopter.spotlightRotationSpeedChase; //Updates to be ready for the first frame updateState(deltaTime); }
public void findPlayer() { state = new SearchInFrenzyState(this, 0.1f, new PursuitState(this, 0.1f, state), state); }
/** * Don't use this unless it's an emergency! * State behavior should *always* be handled by the states themselves * The only time this is called is when the player dies. * Messing with the states through HeliScript breaks * the discretized finite state machine logic that controls its AI */ public void resetState() { state = new IdleState(this, Time.deltaTime); }