示例#1
0
 /// <summary>
 /// Send the swarmbase to the main hive
 /// </summary>
 void GoToHive()
 {
     state = CopState.GoToHive;
     currentSwarm.TargetPosition  = GetClosestHiveCop();
     currentSwarm.OnTargetReached = null;
     currentSwarm.OnTargetReached = ReturnFromHive;
 }
示例#2
0
 public void FixPosition()
 {
     currentSwarm.TargetPosition = transform.position;
     state = CopState.JustPlaced;
     currentSwarm.OnTargetReached += () =>
     {
         state            = CopState.Idle;
         collider.enabled = true;
     };
 }
示例#3
0
 /// <summary>
 ///
 /// </summary>
 void ReturnFromHive()
 {
     CoroutineUtils.ExecuteWhenFinished(this, new WaitForSeconds(timeToReload), () =>
     {
         _countPoliTest = basePoliTest;
         currentSwarm.TargetPosition  = transform.position;
         currentSwarm.OnTargetReached = null;
         currentSwarm.OnTargetReached = () => { state = CopState.Idle; };
     });
 }
    // Use this for initialization
    void Start()
    {
        charController = this.GetComponent <Rigidbody>();
        player         = GameObject.Find("Robber");
        currentState   = CopState.patrolling;
        curPatrolPoint = 0;
        forwards       = true;
        //initalize timers
        alertTimer           = maxAlertTime;
        recognitionTimer     = maxRecognitionTime;
        flashLight.range     = alertSightRadius;
        flashLight.spotAngle = sightAngle + 3;
        robber = GameObject.FindGameObjectWithTag("Player").GetComponent <Robber>();
        trash  = GameObject.FindGameObjectsWithTag("disguise");

        if (trash.Length <= 0)
        {
            for (int i = 0; i < trash.Length; i++)
            {
                disguise[i] = trash[i].GetComponent <useDisguise>();
            }
        }
    }
    // Update is called once per frame
    void Update()
    {
        eat = GameObject.FindGameObjectsWithTag("eat");

        for (int i = 0; i < eat.Length; i++)
        {
            if (Vector3.Distance(this.transform.position, eat[i].transform.position) < 10)
            {
                food = true;
            }
            else
            {
                food = false;
            }
        }
        //handle action state of the cop
        switch (currentState)
        {
        //looping back and forth through path
        case CopState.patrolling:
            //set flashlight
            if (flashLight.enabled == true)
            {
                flashLight.enabled = false;
            }

            // Change the cop from red to blue if necessary
            if (minimapSphere.GetComponent <MeshRenderer>().material != materialBlue)
            {
                minimapSphere.GetComponent <MeshRenderer>().material = materialBlue;
            }

            //check for player
            //check if player is obstructed
            RaycastHit hit;

            Vector3 dir = player.transform.position - transform.position;

            float angle = Vector3.Angle(transform.forward, player.transform.position - transform.position);
            if (!player.GetComponent <pickUp>().hidden&& Vector3.Distance(player.transform.position, transform.position) < alertSightRadius && angle < sightAngle && Physics.Raycast(transform.position, dir, out hit) && hit.transform.name == "Robber")
            {
                lastKnownPos = player.transform.position;
                currentState = CopState.alert;
            }
            //set speed
            if (patrolSpeed != curSpeed)
            {
                curSpeed = patrolSpeed;
            }

            //if we reached a target
            if (curTargetPoint == null)
            {
                //change index based on movement direction
                if (forwards)
                {
                    curPatrolPoint++;
                }
                else
                {
                    curPatrolPoint--;
                }
                //Debug.Log(curPatrolPoint);
                curTargetPoint = patrolPath[curPatrolPoint];
            }
            //if reached target
            else if (Vector3.Distance(transform.position, curTargetPoint.position) < .5f)
            {
                curTargetPoint = null;

                //bounce off of edges of list
                if (curPatrolPoint >= patrolPath.Count - 1 && forwards == true)
                {
                    forwards = false;
                }
                else if (curPatrolPoint <= 0 && forwards == false)
                {
                    forwards = true;
                }
            }

            if (curTargetPoint != null)
            {
                Vector3 normalizedDirection = Vector3.Normalize(curTargetPoint.position - transform.position);
                charController.MoveRotation(Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.Normalize(curTargetPoint.position - transform.position)), Time.deltaTime * 5f));
                charController.MovePosition(transform.position + normalizedDirection * curSpeed * Time.deltaTime);
            }
            break;

        //chasing player
        case CopState.pursuit:
            Debug.Log("Pursuit");
            //set speed
            if (curSpeed < pursuitSpeed)
            {
                curSpeed = pursuitSpeed;
            }

            if (!food)
            {
                dir   = player.transform.position - transform.position;
                angle = Vector3.Angle(transform.forward, player.transform.position - transform.position);
                if (!player.GetComponent <pickUp>().hidden&& Vector3.Distance(player.transform.position, transform.position) < alertSightRadius && angle < pursuitSightAngle && ((Physics.Raycast(transform.position, dir, out hit) && hit.transform.name == "Robber") || Vector3.Distance(player.transform.position, transform.position) < patrolSightRadius / 2))
                {
                    lastKnownPos = player.transform.position;
                    pursuitTimer = maxPursuitTime;
                }
                else
                {
                    pursuitTimer -= Time.deltaTime;
                    if (pursuitTimer <= 0f)
                    {
                        pursuitTimer = maxPursuitTime;
                        currentState = CopState.patrolling;
                    }
                }
                if (Vector3.Distance(transform.position, lastKnownPos) < .5f)
                {
                    charController.MoveRotation(Quaternion.Euler(transform.rotation.eulerAngles + new Vector3(0f, 45f * Time.deltaTime, 0f)));
                }
                else
                {
                    //move towards the player's last known position
                    Vector3 playerDirection = Vector3.Normalize(lastKnownPos - transform.position);
                    charController.MoveRotation(Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.Normalize(lastKnownPos - transform.position)), Time.deltaTime * 15f));
                    charController.MovePosition(transform.position + playerDirection * curSpeed * Time.deltaTime);
                }
            }
            else if (food)
            {
                for (int i = 0; i < eat.Length; i++)
                {
                    dir   = eat[i].transform.position - transform.position;
                    angle = Vector3.Angle(transform.forward, eat[i].transform.position - transform.position);
                    if (Vector3.Distance(player.transform.position, transform.position) < alertSightRadius && angle < pursuitSightAngle && ((Physics.Raycast(transform.position, dir, out hit) && hit.transform.name == "Robber") || Vector3.Distance(eat[i].transform.position, transform.position) < patrolSightRadius / 2))
                    {
                        lastKnownPos = eat[i].transform.position;
                        pursuitTimer = maxPursuitTime;
                    }
                    else
                    {
                        pursuitTimer -= Time.deltaTime;
                        if (pursuitTimer <= 0f)
                        {
                            pursuitTimer = maxPursuitTime;
                            currentState = CopState.patrolling;
                        }
                    }
                    if (Vector3.Distance(transform.position, lastKnownPos) < .5f)
                    {
                        charController.MoveRotation(Quaternion.Euler(transform.rotation.eulerAngles + new Vector3(0f, 45f * Time.deltaTime, 0f)));
                    }
                    else
                    {
                        //move towards the player's last known position
                        Vector3 playerDirection = Vector3.Normalize(lastKnownPos - transform.position);
                        charController.MoveRotation(Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.Normalize(lastKnownPos - transform.position)), Time.deltaTime * 15f));
                        charController.MovePosition(transform.position + playerDirection * curSpeed * Time.deltaTime);
                    }
                }

                duration -= Time.deltaTime;

                if (duration <= 0)
                {
                    food     = false;
                    duration = 5;
                }
            }

            break;

        //sighted something, moving towards it
        case CopState.alert:
            Debug.Log("Alerted");
            //set flashlight
            if (flashLight.enabled == false)
            {
                flashLight.enabled = true;
            }

            // Change the cop from blue to red if necessary
            if (minimapSphere.GetComponent <MeshRenderer>().material != materialRed)
            {
                minimapSphere.GetComponent <MeshRenderer>().material = materialRed;
            }

            //check if player is obstructed
            dir = player.transform.position - transform.position;

            angle = Vector3.Angle(transform.forward, player.transform.position - transform.position);
            if (Vector3.Distance(player.transform.position, transform.position) < alertSightRadius && angle < sightAngle && Physics.Raycast(transform.position, dir, out hit) && hit.transform.name == "Robber")
            {
                recognitionTimer -= Time.deltaTime;

                //reset alert timer if we see the player again
                alertTimer = maxAlertTime;
                //update the last known position of the player
                lastKnownPos = player.transform.position;
                //time allowed to recognize the player for pursuit
                if (recognitionTimer <= 0f)
                {
                    recognitionTimer = maxRecognitionTime;
                    currentState     = CopState.pursuit;
                }
            }
            //if we're out of alert time, go back to patrolling
            alertTimer -= Time.deltaTime;
            if (alertTimer <= 0f)
            {
                alertTimer   = maxAlertTime;
                currentState = CopState.patrolling;
            }

            //move towards the player's last known position
            Vector3 direction = Vector3.Normalize(lastKnownPos - transform.position);
            charController.MoveRotation(Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.Normalize(lastKnownPos - transform.position)), Time.deltaTime * 10f));
            charController.MovePosition(transform.position + direction * curSpeed * Time.deltaTime);
            break;
        }

        /*if (disguise.Length <= 0)
         * {
         *  if (robber.moving == false)
         *      player.GetComponent<pickUp>().hidden = true; ;
         * }
         * else
         * {
         *  for (int i = 0; i < disguise.Length; i++)
         *  {
         *      if (robber.moving == false || disguise[i].disguise == true)
         *          player.hidden = true;
         *  }
         * }*/
        for (int i = 0; i < disguise.Length; i++)
        {
            if (currentState != CopState.pursuit && disguise[i].disguise)
            {
                currentState = CopState.patrolling;
            }
        }
    }
示例#6
0
 void ChangeState(CopState newState)
 {
     oldState = state;
     state = newState;
 }
示例#7
0
 void ChangeState(CopState newState)
 {
     oldState = state;
     state    = newState;
 }
示例#8
0
 public void ChangePosition()
 {
     state            = CopState.Placement;
     collider.enabled = false;
 }