Ejemplo n.º 1
0
 private void ChasePlayer()
 {
     stateText.text = "Chasing";
     currentState   = ZookeeperState.Chasing;
     running        = true;
     nav.speed      = runSpeed;
     nav.SetDestination(player.transform.position);
 }
Ejemplo n.º 2
0
 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;
     }
 }
Ejemplo n.º 3
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;
        }
    }
Ejemplo n.º 4
0
 private void Stop()
 {
     stateText.text = "Stopped";
     nav.Stop();
     currentState = ZookeeperState.Stopped;
 }