/// <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; } }
/// <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; } }