//Following Routine follows player until input says stop or return home //input can also switch to hungry state void FollowingRoutine(Vector3 playerDir, float playerDistance) { transform.LookAt(player.transform.position); Vector3 f = transform.TransformDirection(playerDir); if (playerDistance < 55) { c.SimpleMove(Vector3.zero * 0); } else { c.Move(playerDir * followSpeed * Time.deltaTime); } if (Input.GetKey(KeyCode.G)) { print("pride stopped following"); player.RemoveFollower(); nprideState = prideState.IDLE; } if (Input.GetKey(KeyCode.H)) { print("pride headed home"); nprideState = prideState.HOMEWARD; } if (Input.GetKey(KeyCode.J)) { print("pride went hunting"); nprideState = prideState.HUNGRY; } }
//Homeward Routine sends character home then switches to idle void HomewardRoutine() { GameObject[] homeObj; homeObj = GameObject.FindGameObjectsWithTag("Home"); //gets current target position and distance Vector3 homeDir = homeObj[0].transform.position - transform.position; float homeDistance = Vector3.Distance(homeObj[0].transform.position, transform.position); transform.LookAt(homeObj[0].transform.position); if (homeObj.Length == 0) { Debug.Log("No game objects are tagged with 'Home'"); } Vector3 f = transform.TransformDirection(homeDir); c.SimpleMove(f * seekSpeed); //c.Move(f * movementSpeed * Time.deltaTime); if (homeDistance < 20) { c.SimpleMove(Vector3.zero * 0); nprideState = prideState.IDLE; } }
private void OnControllerColliderHit(ControllerColliderHit other) { if (other.gameObject.CompareTag("Prey")) { { biteSound.Play(); //Destroy(other.gameObject); currHunger = Globals.full_hun; nprideState = prideState.IDLE; Debug.Log("hit prey"); health_bar.ResetHunger(); } } if (other.gameObject.CompareTag("Player")) { { touchingPlayer = true; //print("Follow that player"); } } if (other.gameObject.CompareTag("Home")) { { Debug.Log("Home"); health_bar.ResetEnergy(); } } }
//Following Routine follows player until input says stop or return home //input can also switch to hungry state void FollowingRoutine(Vector3 playerDir, float playerDistance) { isFollowing = true; transform.LookAt(player.transform.position); Vector3 f = transform.TransformDirection(playerDir); if (!isHunting) { animState = 2; if (playerDistance > 25) { touchingPlayer = false; } if (touchingPlayer) { c.SimpleMove(Vector3.zero * 0); animState = 1; } else { c.Move(playerDir * followSpeed * Time.deltaTime); //animState = 2; } } if (Input.GetKey(KeyCode.F)) { isHunting = false; } if (Input.GetKey(KeyCode.G)) { print("pride stopped following"); player.RemoveFollower(); nprideState = prideState.IDLE; isFollowing = false; } else if (Input.GetKey(KeyCode.H)) { print("pride headed home"); nprideState = prideState.HOMEWARD; isFollowing = false; } else if (Input.GetKey(KeyCode.J)) { touchingPlayer = false; print("pride went hunting"); nprideState = prideState.HUNGRY; isFollowing = false; } else if (Input.GetKey(KeyCode.K))//makes pause { c.SimpleMove(Vector3.zero * 0); animState = 1; isHunting = true; } }
void HungryRoutine(float playerDistance) { //gets all prey tag objects in world var eatObjects = GameObject.FindGameObjectsWithTag("Prey"); var eatCount = eatObjects.Length; print(eatCount); if (eatCount > 0) { //sets prey obj target var eatTarget = eatObjects[0]; Vector3 eatDir = eatTarget.transform.position - transform.position; float eatAngle = Vector3.Angle(eatDir, transform.forward); if (eatAngle < 150.0F) { transform.LookAt(eatTarget.transform.position); c.Move(eatDir.normalized * movementSpeed * Time.deltaTime); animState = 2; } else { print("Cannot find prey"); //should wander to find it } } if (currHunger <= -Globals.full_hun) { // nherdState = herdState.DEAD; } if (playerDistance < 20 && Input.GetKey(KeyCode.F))// | if (player_angle <= 50.0F) { SetTarget(target); nprideState = prideState.FOLLOWING; player.AddFollower(this); print("pride started following"); } else if (Input.GetKey(KeyCode.H)) { SetTarget(target); nprideState = prideState.HOMEWARD; print("pride headed home"); } }
private void OnControllerColliderHit(ControllerColliderHit other) { if (other.gameObject.CompareTag("Prey")) { { biteSound.Play(); Destroy(other.gameObject); currHunger = Globals.full_hun; nprideState = prideState.IDLE; } } if (other.gameObject.CompareTag("Player")) { { //print("Follow that player"); } } }
//Performs IDLE state routines // switches to follow state if player recruits //switches to hungry state if hunger low //switches to homeward state if player calls //else Wanders void IdleRoutine(float playerDistance) { if (playerDistance < 20 && Input.GetKey(KeyCode.F))// | if (player_angle <= 50.0F) { SetTarget(target); nprideState = prideState.FOLLOWING; player.AddFollower(this); print("pride started following"); } else if (Input.GetKey(KeyCode.H)) { SetTarget(target); nprideState = prideState.HOMEWARD; print("pride headed home"); } else if (currHunger <= 0) { nprideState = prideState.HUNGRY; // sent itself after food } }
// Update is called once per frame void Update() { currHunger--; if (health_bar.health <= 0) { isAlive = false; animState = 10; this.gameObject.tag = "Untagged"; nprideState = prideState.DEAD; } //gets current target position and distance Vector3 playerDir = player.transform.position - transform.position; float playerAngle = Vector3.Angle(playerDir, transform.forward); float playerDistance = Vector3.Distance(player.transform.position, transform.position); //Performs wandering routines if (isAlive) { if (!isWalking) { animState = 1; } if (isWandering == false) { StartCoroutine(Wander()); } if (isRotatingRight == true) { transform.Rotate(0, rotSpeed * Time.deltaTime, 0); animState = 3; } if (isRotatingLeft == true) { transform.Rotate(0, -rotSpeed * Time.deltaTime, 0); animState = 4; } if (!isFollowing) { if (isWalking == true) { Vector3 f = transform.TransformDirection(Vector3.forward); c.SimpleMove(f * movementSpeed); animState = 5; } } } //Performs stateful routines switch (nprideState) { case prideState.IDLE: IdleRoutine(playerDistance); break; case prideState.HUNGRY: HungryRoutine(playerDistance); break; case prideState.HOMEWARD: HomewardRoutine(); break; case prideState.DEAD: // DeadRoutine(); break; case prideState.FOLLOWING: FollowingRoutine(playerDir, playerDistance); break; } AnimationHandler(animState); //grounded handler if (c.isGrounded) { verticalSpeed = -c.stepOffset / Time.deltaTime; } else { verticalSpeed -= playerGravity * Time.deltaTime; } Vector3 m = new Vector3(0, verticalSpeed, 0); movement = movement + (m * Time.deltaTime * 2); c.Move(movement); }