Beispiel #1
0
    // Start is called before the first frame update
    void Start()
    {
        gameManager = FindObjectOfType <GameManager>();

        currentState = initalState;
        selectDestination();
    }
Beispiel #2
0
    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;
        }
    }