Esempio n. 1
0
    /// <summary>
    /// Explicitly define default state transitions here
    /// </summary>
    /// <param name="eventObject">Event object.</param>
    void HandleStateFinished(EventObject eventObject)
    {
        if (IsDead())
        {
            return;
        }

        switch (_currentAction)
        {
        case EnemyActionType.Idle:
            // After idle time is over, start walking in random places
            PushAction(EnemyActionType.Wandering);
            break;

        case EnemyActionType.Wandering:
            // Return to previous state which should always be idle
            PopAction();
            break;

        case EnemyActionType.Hit:
            // After zombie got shot, automatically trigger attention
            // and start chasing the player who made the shot
            PopAction();
            if (_currentAction != EnemyActionType.Screaming &&
                _currentAction != EnemyActionType.Following &&
                _currentAction != EnemyActionType.Attacking)
            {
                ChangeAction(EnemyActionType.Screaming);
            }
            break;

        case EnemyActionType.Screaming:
            // After the attention animation, start chasing player
            ChangeAction(EnemyActionType.Following);
            break;

        case EnemyActionType.Attacking:
            // Go back to previous state which is always FollowState
            PopAction();
            break;

        default:
            // default back to idle state
            ChangeAction(EnemyActionType.Idle);
            break;
        }
    }
Esempio n. 2
0
    /// <summary>
    /// Explicitly define state transitions based on external signals
    /// like collisions, sound, light, etc...
    /// </summary>
    /// <param name="eventObject">Event object.</param>
    void HandleSensorDetected(EventObject eventObject)
    {
        if (IsDead())
        {
            return;
        }

        switch (eventObject.EventName)
        {
        // when player is within line of sight of player
        case EnemySensors.EVENT_PLAYER_VISIBLE:
            GameObject playerObject = (GameObject)eventObject.GetParam(0);
            player = playerObject.transform.root;
            if (_currentAction != EnemyActionType.Screaming &&
                _currentAction != EnemyActionType.Following &&
                _currentAction != EnemyActionType.Attacking)
            {
                ChangeAction(EnemyActionType.Screaming);
            }
            break;

        case EnemySensors.EVENT_PLAYER_HIDDEN:
            player = null;
            if (_currentAction == EnemyActionType.Screaming ||
                _currentAction == EnemyActionType.Following)
            {
                ChangeAction(EnemyActionType.Idle);
            }
            break;

        // when player is within reach of zombie
        // - either try to kill the player
        // - or start eating *nomnomnom*
        case EnemySensors.EVENT_PLAYER_WITHIN_REACH:
            PlayerStatus playerStatus = (PlayerStatus)eventObject.GetParam(0);
            player = playerStatus.transform.root;
            if (playerStatus.HitPoint > 0f)
            {
                if (_currentAction != EnemyActionType.Following)
                {
                    ChangeAction(EnemyActionType.Following);
                }
                if (_currentAction != EnemyActionType.Attacking)
                {
                    PushAction(EnemyActionType.Attacking);
                }
            }
            else
            {
                if (_currentAction != EnemyActionType.Eating)
                {
                    ChangeAction(EnemyActionType.Eating);
                }
            }
            break;

        case EnemySensors.EVENT_PLAYER_OUT_OF_REACH:
            PopAction();
            break;

        case EnemySensors.EVENT_ZOMBIE_DAMAGED:
            PushAction(EnemyActionType.Hit);
            break;

        case EnemySensors.EVENT_ZOMBIE_DIED:
            ChangeAction(EnemyActionType.Dead);
            break;

        default:
            Debug.Log("Unknown sensor event: " + eventObject.EventName);
            break;
        }
    }