void updateTargetSpotlightRotation(float deltaTime) { Vector3 spotPos = helicopter.getSpotlight().transform.position; if (helicopter.getSpotlight().transform.rotation == targetSpotlightRotation) { //build new target position for helicopter to rotate to targetSpotPos = Vector3.zero; targetSpotPos.x = frenzy.getLastKnownPlayerPosition().x; targetSpotPos.x += helicopter.xOffsetLightSearch.nextValue(deltaTime); targetSpotPos.y = frenzy.getLastKnownPlayerPosition().y; } //Vector representing drawing directions to get from spotlight to player Vector3 hypotenuse = targetSpotPos - spotPos; hypotenuse.z = 0; //ratio to calculate angle through atan float ratio = -1 * hypotenuse.x / hypotenuse.y; //Offset from vertically down that the spotlight should point float radOffset = Mathf.Atan(ratio); //converted float degOffset = Mathf.Rad2Deg * radOffset; //The spotlight rotation should be quaternion representation of that offset targetSpotlightRotation = Quaternion.Euler(0, 0, degOffset); }
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); }
void updateTargetSpotlightRotation(float deltaTime) { //Absolute position of spotlight Vector3 spotPos = helicopter.getSpotlight().transform.position; //Abs pos of player Vector3 playerPos = player.transform.position; Vector3 xOffset = Vector3.right * helicopter.xOffsetLightChase.nextValue(deltaTime); Vector3 targetLocation = playerPos + xOffset; //Vector representing drawing directions to get from spotlight to player Vector3 hypotenuse = targetLocation - spotPos; hypotenuse.z = 0; //ratio to calculate angle through atan float ratio = -1 * hypotenuse.x / hypotenuse.y; //Offset from vertically down that the spotlight should point float radOffset = Mathf.Atan(ratio); //converted float degOffset = Mathf.Rad2Deg * radOffset; //The spotlight rotation should be quaternion representation of that offset targetSpotlightRotation = Quaternion.Euler(0, 0, degOffset); }
/** * 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); }
//Constructor run when creating IdleState public IdleState(HeliScript helicopter, float deltaTime) { this.helicopter = helicopter; flippedThisFrame = false; horizontalSpeed = helicopter.speed; targetSpotlightRotation = helicopter.getSpotlight().transform.rotation; spotlightRotationSpeed = 0f; rootPosition = helicopter.transform.position; traversalDistance = helicopter.idleRoamingDistanceCovered; justSawPlayer = false; updateState(deltaTime); }