// Start is called before the first frame update void Start() { gameManager = FindObjectOfType <GameManager>(); currentState = initalState; selectDestination(); }
private void updateState() { switch (currentState) { case HomeownerState.Moving: if (sawAnyTargetThisFrame) { //Transition to focusing transform.GetChild(0).GetComponent <Animator>().SetTrigger("Point"); currentState = HomeownerState.Focusing; } else if (!destination) { break; } var direction = directionToDestination(); var distance = direction.magnitude; if (distance < destination.arrivalRadius) //Transition to waiting { waitingTime = Random.Range(destination.minDuration, destination.maxDuration); currentState = HomeownerState.Waiting; } else //Continue moving to and facing destination { var velocity = direction.normalized * movementSpeed * Time.deltaTime; transform.Translate(velocity, Space.World); var angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg - 90; var q = Quaternion.AngleAxis(angle, Vector3.forward); transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * turnSpeed); } break; case HomeownerState.Waiting: waitingTime -= Time.deltaTime; if (sawAnyTargetThisFrame) { transform.GetChild(0).GetComponent <Animator>().SetTrigger("Point"); currentState = HomeownerState.Focusing; } else if (waitingTime <= 0) { selectDestination(); currentState = HomeownerState.Moving; } break; case HomeownerState.Focusing: if (currentAlarm >= maxAlarm) { gameManager.EndGame(); return; } if (!sawAnyTargetThisFrame) { currentState = HomeownerState.Looking; } else //Face the last seen target { direction.x = lastSeen.x - transform.position.x; direction.y = lastSeen.y - transform.position.y; var angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg - 90; var q = Quaternion.AngleAxis(angle, Vector3.forward); transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * turnSpeed); } break; case HomeownerState.Looking: if (sawAnyTargetThisFrame) { transform.GetChild(0).GetComponent <Animator>().SetTrigger("Point"); currentState = HomeownerState.Focusing; } else if (timeInState >= lookingTime) { currentState = HomeownerState.Moving; } break; default: break; } }