private void ChasePlayer() { stateText.text = "Chasing"; currentState = ZookeeperState.Chasing; running = true; nav.speed = runSpeed; nav.SetDestination(player.transform.position); }
private void ResumePatrol() { running = false; nav.speed = walkSpeed; stateText.text = "Patrolling"; currentState = ZookeeperState.Patrolling; nav.SetDestination(waypoints[nextWaypoint]); nextWaypoint++; if (nextWaypoint >= waypoints.Length) { nextWaypoint = 0; } }
// Update is called once per frame void Update() { //apply walk/run animation while moving //most reliable way to get speed is based on position difference from last frame Vector3 curMove = transform.position - previousPosition; var curSpeed = curMove.magnitude / Time.deltaTime; previousPosition = transform.position; //determine how to scale the velocity to set the animation parameter. //walking and running are part of a blend tree, where walking is set to 0.5 vSpeed, and run is 1 VSpeed. //so, scale running to 1 and scale walking to 0.5 var scale = running ? runSpeed : walkSpeed * 2; anim.SetFloat("VSpeed", curSpeed / scale); //check if the zookeeper can see the player bool seePlayer = CanSeePlayer(); //AI state machine switch (currentState) { case ZookeeperState.Patrolling: if (seePlayer) { ChasePlayer(); } else { //check if we have reached our current waypoint if (arrivedAtWaypoint()) { //yep, wait here for pause time waypointArriveTime = Time.time; stateText.text = "Paused"; currentState = ZookeeperState.Paused; } } break; case ZookeeperState.Paused: if (seePlayer) { ChasePlayer(); } else if (Time.time > waypointArriveTime + waypointPauseTime) { ResumePatrol(); } break; case ZookeeperState.Chasing: if (!seePlayer) { //lost sight of the player while chasing him. //keep going toward current waypoint (his last known position) //set up timeout to give up the search lostTime = Time.time; stateText.text = "Searching"; currentState = ZookeeperState.Searching; } else { nav.SetDestination(player.transform.position); } break; case ZookeeperState.Searching: if (seePlayer) { ChasePlayer(); } if (Time.time > lostTime + MaxSearchTime) { ResumePatrol(); } if (arrivedAtWaypoint()) { running = false; nav.speed = walkSpeed; //walk speed //TODO: turn in place a couple times to look for the player } break; case ZookeeperState.Stopped: //game over? break; } }
private void Stop() { stateText.text = "Stopped"; nav.Stop(); currentState = ZookeeperState.Stopped; }