/// <summary> /// Send the swarmbase to the main hive /// </summary> void GoToHive() { state = CopState.GoToHive; currentSwarm.TargetPosition = GetClosestHiveCop(); currentSwarm.OnTargetReached = null; currentSwarm.OnTargetReached = ReturnFromHive; }
public void FixPosition() { currentSwarm.TargetPosition = transform.position; state = CopState.JustPlaced; currentSwarm.OnTargetReached += () => { state = CopState.Idle; collider.enabled = true; }; }
/// <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; } } }
void ChangeState(CopState newState) { oldState = state; state = newState; }
void ChangeState(CopState newState) { oldState = state; state = newState; }
public void ChangePosition() { state = CopState.Placement; collider.enabled = false; }