//Hungry Routine seeks out grass objects and moves to eat them // not able to flee while eating // if cannot find food, enters DEAD state void HungryRoutine() { //gets all grass tag objects in world var eatObjects = GameObject.FindGameObjectsWithTag("Grass"); var eatCount = eatObjects.Length; if (eatCount > 0) { //sets grass obj target var eatTarget = eatObjects[0]; Vector3 eatDir = eatTarget.transform.position - transform.position; //gets angle to grass obj float eatAngle = Vector3.Angle(eatDir, transform.forward); if (eatAngle < 350.0F) { transform.LookAt(eatTarget.transform.position); c.Move(eatDir.normalized * seekSpeed * Time.deltaTime); nherdState = herdState.IDLE; } else { print("Cannot find grass"); //should wander to find it } } if (currHunger <= -Globals.full_hun) { // nherdState = herdState.DEAD; } }
private void OnTriggerEnter(Collider other) { if (other.CompareTag("Grass")) { EatGrass(other); } if (other.CompareTag("VisionCone")) { print("Smelled predator"); nherdState = herdState.FLEEING; } }
//Performs IDLE state routines // switches to flee state if found player //switches to eating state if hungry //else Wanders void IdleRoutine(float playerDistance) { if (playerDistance < 25)// | if (player_angle <= 50.0F) { SetTarget(target); nherdState = herdState.FLEEING; } else if (currHunger <= 0) { // nherdState = herdState.HUNGRY; // temporary since no grass yet } }
//Flee Routine runs from player or target //nneds to rotate away and run away quickly void FleeRoutine(float playerDistance) { Vector3 f = transform.TransformDirection(Vector3.forward); c.SimpleMove(f * fleeSpeed); //c.Move(transform.forward * fleeSpeed * Time.deltaTime); if (playerDistance > 40) { SetTarget(null); nherdState = herdState.IDLE; } }
private void OnControllerColliderHit(ControllerColliderHit other) { if (other.gameObject.CompareTag("Predator")) { { print("Hit by predator"); nherdState = herdState.DEAD; biteSound.Play(); //Destroy(this.gameObject); } } if (other.gameObject.CompareTag("Player")) { { print("Hit by player"); nherdState = herdState.DEAD; biteSound.Play(); // Destroy(this.gameObject); } } }
void Update() { hunger--; Vector3 forward = transform.forward; Vector3 playerDir = player.transform.position - transform.position; float player_angle = Vector3.Angle(playerDir, forward); var distance = Vector3.Distance(player.transform.position, transform.position); // print(distance); if (isWandering == false) { StartCoroutine(Wander()); } if (isRotatingRight == true) { transform.Rotate(transform.up * Time.deltaTime * rotSpeed); } if (isRotatingLeft == true) { transform.Rotate(transform.up * Time.deltaTime * -rotSpeed); } if (isWalking == true) { transform.position += transform.forward * movementSpeed * Time.deltaTime; } switch (nherdState) { case herdState.IDLE: //Look for player eating = 1000; //restore eating timer if (distance < 20) //if (player_angle <= 50.0F) { //if player is found SetTarget(target); nherdState = herdState.FLEEING; print("! --------------- ZEBRA FLEE"); } //Check hunger //if hunger low, look for grass else if (hunger <= 0) { //print("Hungry"); var objects = GameObject.FindGameObjectsWithTag("Grass"); var objectCount = objects.Length; var obj = objects[0]; Vector3 grassDir = obj.transform.position - transform.position; float grass_angle = Vector3.Angle(grassDir, forward); if (grass_angle < 300.0F) { transform.LookAt(obj.transform.position, Vector3.zero); transform.position = Vector3.MoveTowards(transform.position, obj.transform.position, seekSpeed); // nherdState = herdState.EATING; print("! --------------- ZEBRA EAT"); } else { print("Cannot find grass"); } } break; case herdState.FLEEING: transform.position += transform.forward * movementSpeed * Time.deltaTime; if (distance > 40) { SetTarget(null); nherdState = herdState.IDLE; print("! --------------- ZEBRA IDLE"); } break; /* case herdState.EATING: * eating--; * if (eating <= 0) * { * nherdState = herdState.IDLE; * print("! --------------- ZEBRA IDLE"); * } * break; * //etc.*/ } }